2016-03-22 6 views
2

Ich entwickle eine Android App, die einige Bilder von einer Website in MainActivity anzeigt. Es gibt einige andere Aktivitäten, die sich im Wesentlichen mit den Offline-Inhalten wie dem Umgang mit Datenbank und Konfiguration befassen.Multi Threading in Android

Zur Zeit ist die App so aufgebaut, dass sie sich von MainActivity zu anderen Aktivitäten navigiert. Zuerst wird sie sich selbst zerstören (calling finish()) und dann navigieren. Wenn Sie von einer anderen Aktivität zu MainActivity navigieren, werden diese Aktivitäten vor dem Verschieben ebenfalls zerstört.

App funktioniert zunächst gut. Wenn der Benutzer jedoch zu häufig zwischen Aktivitäten navigiert, dauert die Aufgabe zum Herunterladen von Bildern auf der Hauptseite sehr lange.

In dem obigen Fall gibt es kein Problem, die Bilder in MainActivity zunächst anzuzeigen. Aber im nächsten Fall braucht es ungewöhnliche Zeit.

Was ich vorhabe, ein Multithreading-Szenario zu implementieren, das jedes Mal einen neuen Thread erstellt, wenn die Anwendung versucht, zu MainActivity zu navigieren und das vorhandene zu zerstören.

Thread-0 : MainActivity --> Activity1 (to go Main) --> Kill Thread-0 and Create Thread-1 
Thread-1 : MainActivity --> Activity1 --> Activity2 (to go to Main) --> Kill Thread-1 and create Thread-2 

Aber ich habe keine Ahnung, wie Sie das gleiche implementieren. Jeder Vorschlag oder Referenzlink ist sehr willkommen.

+0

Im Allgemeinen erstellen Sie mit Android ein neues 'Thread', wenn Sie einen Job haben, den Sie erledigen müssen. Ein Bild zum Beispiel herunterladen. Dieser 'Thread' wird zurück zum UI-Thread gepostet, um ihm die Informationen zu geben, um zum Beispiel' ImageView' zu aktualisieren. Warum machst du neue Threads? – Knossos

Antwort

1

versuchen, eine AsyncTask wie diese verwenden:

public class MyTask extends AsyncTask<Void, Void, Void> { 

     private volatile boolean running = true; 

     @Override 
     protected void onCancelled() { 
      running = false; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 

      while (running) { 
       // download 
      } 
      return null; 
     } 

    } 

Aktivität:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    task = new MyTask(); 
    task.execute(); 
    } 

    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    if (task != null) task.cancel(true); 
    } 

Aber für mich die einfachste Möglichkeit zum Herunterladen und Anzeigen von Bildern wird Picasso verwenden.

Seine so einfach:

Picasso.with(context) 
    .load(url) 
    .resize(50, 50) 
    .centerCrop() 
    .into(imageView) 
0

Wahrscheinlich die beste Möglichkeit, dieses Verhalten zu implementieren, ist die Verwendung der AsyncTask. Sie können es wie folgt starten

new YourAsyncTask().execute(); 

es so Abbrechen:

mTask.cancel(true); 

Und Sie können es doInBackground() verwenden ist, onProgressUpdate() und onPostExecute(), um es wie Sie wollen, machen ausführen (jede Methode ist ziemlich selbsterklärend durch den Namen selbst).

0

Haben Sie beim Laden von Bildern die Logik des Cache-Speichers implementiert? Wenn also ein Bild heruntergeladen wird, wird es nicht erneut heruntergeladen, sondern es wird (eine Aktivität oder die andere) im Cache angezeigt.

+0

Die Inhalte in den Bildern ändern sich jede Sekunde. Also ich brauche immer die neuesten Bilder. Die Verwendung des Caches löst das Problem möglicherweise nicht. Danke für den Vorschlag :) – Biswajit

0
  • Erstellen BaseActivity Klasse, die Activity/AppCompatActivity erweitert.
  • erweitern BaseActivity Klasse von Ihrem MainActivity.
  • alle Download-Aufgaben in BaseActivity Do AsyncTask

verwenden, sollten den Trick. :)

0

Wenn Sie laden Bilder häufig erstellen/zu zerstören ein Thread kein guter Ansatz unter Berücksichtigung der Aufwand für die Erstellung und zerstören würde. AsyncTask ist ein OK-Ansatz, aber riskant für Speicherlecks. Mein Vorschlag wäre, Bildladeaufgaben in einem Dienst wie einem IntentService zu behandeln oder einen normalen Service mit einem Hintergrundthread zu erstellen.