簡體   English   中英

將Android Activity的對象傳遞給Thread類的構造函數是一個好習慣嗎?

[英]Is it a good practice to pass an object of Android Activity to a Thread class' constructor?

在編寫一個向Web服務器提交輸入查詢的Android活動時,我想的是沒有匿名內部類來定義網絡線程,為什么我們不能使用擴展Thread的單獨類。

雖然這可以按預期工作,但我想知道這是否屬於任何好的或壞的做法。

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);
         . . . . . . 
    }

}

在您的情況下,不是沒有,因為只有UI Thread可以觸摸UI,您的代碼將使您的應用程序崩潰

android.view.ViewRoot$CalledFromWrongThreadException
  1. 將一個Activity引用傳遞給一個線程有一些警告。 活動生命周期與線程生命周期是分開的。 可以通過例如方向改變事件來銷毀和重建活動。 如果活動引用在一個線程中保留,那么活動所擁有的資源(例如,大量位圖資產占用大量內存)不是垃圾收集的。

    非靜態內部類也具有相同的問題,因為對父項的引用是隱式的。

    工作解決方案是在銷毀活動時清除活動引用,並在重新創建活動時提供新的活動引用。

  2. 您只能觸摸blackbelt提到的UI線程中的UI小部件。

對於它的價值, AsyncTask比簡單的Thread更容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM