Probleme mit App

T

Turbo1976

Neues Mitglied
0
Hallo an euch,

habe meine erste App fertiggestellt. Als Entwicklungsumgebung habe ich Android Studio und als Testgerät ein Galaxy S3 verwendet. Auf dem S3 funktioniert alles perfekt.
Als alles soweit fertig war, habe ich eine signed .apk erstellt und mir diese per E-Mail auf mein S5 mini geschickt und dort installiert.

So weit so gut. Die App macht eigentlich auch alles. Nur eine Sache funktioniert nicht.
In der main Activity habe ich einen Button Listener definiert. Wird der Button gedrückt, dann startet ein neuer Thread, der über SSH aus einer Datei GPS-Koordinaten ausliest. Nach Aufruf des Threads mache ich einen Stop des Haupt-Threads für 3 Sekunden, damit die SSH-Daten geladen werden können. Nach den 3 Sekunden mache ich einen Intent auf eine Google Map Activity, die die ausgelesenen GPS-Koordinaten auf der Karte anzeigt.

Auf dem S3 funktioniert das einwandfrei.

Auf dem S5 zeigt er mir nur einem weißen Hintergrund mit dem Google Schriftzug links unten an.

Habt ihr eine Idee, woran das liegen kann? Selbst wenn ich den Haupt-Thread auf 10 Sekunden stoppe wird der weiße Hintergrund angezeigt. Wobei die Karte genauso schnell lädt, wie wenn der Timer auf 3 Sekunden eingestellt wird :sad:
 
log cat?
Code?

aber ich rate mal NetworkOnMainThreadException?

lg. Dagobert
 
Also, in der Google Maps Activity mache ich folgendes:

Code:
 MapSSH map = new MapSSH();
ArrayList<String> mapData = map.parseData();
  
 int elements = mapData.size();
for (int counter = 0; counter < elements - 1; counter++) {
    String[] parts = mapData.get(counter).split(";");
    String date = parts[0];
    String time = parts[1];
    String latitude = parts[2];
    String longitude = parts[3];
     mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))).title(date + " " + time));
}

In der Klasse MapSSH():
Code:
 public ArrayList<String> parseData() {
  
 Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            JSch jsch = new JSch();
             Session session = jsch.getSession(usernameSSH, serverSSH, Integer.parseInt(portSSH));
            session.setPassword(passwordSSH);
             
             Properties prop = new Properties();
            prop.put("StrictHostKeyChecking", "no");
            session.setConfig(prop);
            session.connect();
             String command = "cat ./test.csv";
            Channel channel = session.openChannel("exec");
            ((ChannelExec)channel).setCommand(command);
             channel.setInputStream(null);
             InputStream in = channel.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
             channel.connect();
             while (reader.readLine() != null) {
                resultSet.add(reader.readLine().toString());
            }
             in.close();
            channel.disconnect();
            session.disconnect();
             } catch (Exception e) {
            }
        }
    });
     thread.start();
     try {
        Thread.sleep(3000);
    }catch (InterruptedException i) {
     }
    return resultSet;
    }
 }


Wie gesagt, auf dem S3 funktioniert das alles super, auf dem S5 mini leider nicht :-(
 
Die entscheidende Frage wird (in den meisten Fällen) nicht auf das Gerät sein, sondern viel mehr die Android Version..
Welche API-Level haben die Geräte jeweils? Vielleicht hast du irgendwo einen v20-Ordner angelegt der falsche Layout-Ressourcen bereitstellt? War jetzt nur eine Überlegung, muss nicht zwangsläufig darauf zurückzuführen sein.
 
Hier liegt auch noch ein grundlegendes Problem vor:
Du lagerst Netzwerkcode in einen Thread aus -> gut, damit der Main Thread nicht blockiert
Du wartest im Hauptthread eine festgelegte Zeitspanne und willst dann auf Ergebnisse aus dem nebenläufigen Thread zugreifen -> schlecht weil a) du dir nie sicher sein kannst, dass der andere Thread schon fertig ist wenn du fertig gewartest hast, b) während der Wartezeit im Main thread deine komplette UI einfriert, das ist eine extrem schlechte User Experience.

In deinem Fall empfehle ich, dass du dir AsyncTask anschaust. Da kannst du in einem asynchronen Thread arbeiten und dann das Ergebnis im Main Thread weiter verarbeiten. Zum Beispiel einem Broadcast mitgeben, der dann deine gewünschte Aktion startet.

Ich gehe übrigens davon aus, dass auf dem S5 dein Code direkt beim Sleep eine InterruptedException wirft (vom System erzwungen, damit Fall b) nicht auftritt) und du das einfach nicht mitbekommst, weil du die einfach ohne Behandlung ignorierst (sollte man auch nie tun, zumindest mal loggen, damit man beim debuggen mitbekommt, das was passiert ist). Dann ist dein resultSet natürlich leer, weil die Daten erst später reinkommen.
 

Ähnliche Themen

R
Antworten
3
Aufrufe
1.634
Ritartet
R
Manny87
  • Manny87
Antworten
11
Aufrufe
167
swa00
swa00
B
Antworten
4
Aufrufe
496
bb321
B
Zurück
Oben Unten