/ / Ist es eine gute Übung, ein Objekt der Android-Aktivität an den Konstruktor einer Thread-Klasse zu übergeben? - Android, Multithreading, Android-Aktivität

Ist es eine gute Übung, ein Objekt der Android-Aktivität an den Konstruktor einer Thread-Klasse zu übergeben? - Android, Multithreading, Android-Aktivität

Beim Schreiben einer Android-Aktivität, die übermittelt wirdBei der Eingabe von Abfragen an einen Webserver dachte ich mir, anstatt eine anonyme innere Klasse zu verwenden, um den Netzwerk-Thread zu definieren, warum können wir keine separate Klasse verwenden, die Thread erweitert.

Während dies wie erwartet funktioniert, würde ich gerne wissen, ob dies eine gute oder schlechte Praxis ist.

public class GreetActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_greet_activity);
}

public void onClickBtn(View v){
Thread t = new WorkerThread("http://10.0.2.2:8080",this);
t.start();
}
}

class WorkerThread extends Thread{
private String targetURL;
private Activity activity;

public WorkerThread(String url, Activity act){
this.activity = act;
this.targetURL = url;
}

public void run(){
TextView tv = (TextView) activity.findViewById(R.id.textview1);
. . . . . .
}

}

Antworten:

1 für die Antwort № 1
  1. Einreichen Activity Verweis auf einen Thread hat einige Vorbehalte. Der Aktivitätslebenszyklus ist vom Thread-Lebenszyklus getrennt. Aktivitäten können zerstört und neu erstellt werden, z. durch Orientierungsänderungsereignisse. Wenn die Aktivitätsreferenz in einem Thread gespeichert ist, sind die Ressourcen, die von der Aktivität gehalten werden (z. B. viele Bitmap-Assets, die viel Speicher belegen), nicht unbrauchbar.

    Eine nicht statische innere Klasse hat das gleiche Problem, da die Referenz auf das Elternelement implizit ist.

    Eine funktionierende Lösung besteht darin, die Aktivitätsreferenz zu löschen, wenn die Aktivität zerstört wird, und eine neue Aktivitätsreferenz anzugeben, wenn die Aktivität neu erstellt wird.

  2. Sie können Ihre UI-Widgets nur im von Blackbelt erwähnten UI-Thread berühren.

Für was es wert ist, ein AsyncTask ist einfacher zu arbeiten als ein bloßes Skelett Thread.


1 für die Antwort № 2

In deinem Fall, nein ist es nicht, da nur die UI Thread kann die Benutzeroberfläche berühren, Ihr Code wird Ihre Anwendung zum Absturz bringen

android.view.ViewRoot$CalledFromWrongThreadException