2014-01-23 98 views
0

在編寫向Web服務器提交輸入查詢的Android活動時,我在考慮不用匿名內部類來定義網絡線程,爲什麼我們不能使用擴展Thread的單獨類。將Android Activity的對象傳遞給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); 
     . . . . . . 
    } 

} 

回答

1
  1. 傳遞一個Activity參照線有一些警告。活動生命週期與線程生命週期是分開的。活動可以被銷燬並重新創建,例如通過定位更改事件。如果活動引用保存在一個線程中,則該活動所擁有的資源(例如大量位圖資源,佔用大量內存)不是垃圾回收。

    非靜態內部類也存在相同的問題,因爲對父項的引用是隱式的。

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

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

對於它的價值,一個AsyncTask更容易與工作比裸機Thread

1

在你的情況下,不,沒有,因爲只有UI Thread可以觸摸的用戶界面,您的代碼將讓你的應用程序崩潰與

android.view.ViewRoot$CalledFromWrongThreadException 
+0

感謝您的信息。但是,當我執行代碼時,它已成功執行。我會嘗試更多地瞭解原因並更新線程。 – DroidPanda

+0

它被發現尋找一個視圖。改變其內容是錯誤的。 @lallto答案真的很好 – Blackbelt

相關問題