将Android Activity的对象传递给Thread类的构造函数是一个好习惯吗?

时间:2014-01-23 09:21:51

标签: android multithreading android-activity

在编写向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);
         . . . . . . 
    }

}

2 个答案:

答案 0 :(得分:1)

在您的情况下,不是没有,因为只有UI Thread可以触摸用户界面,您的代码会使您的应用程序崩溃

android.view.ViewRoot$CalledFromWrongThreadException

答案 1 :(得分:1)

  1. Activity引用传递给线程有一些警告。活动生命周期与线程生命周期是分开的。可以销毁和重建活动,例如通过方向改变事件。如果活动引用在一个线程中保留,那么活动所拥有的资源(例如,大量位图资产占用大量内存)不是垃圾可收集的。

    非静态内部类也存在同样的问题,因为对父项的引用是隐式的。

    工作解决方案是在销毁活动时清除活动参考,并在重新创建活动时提供新的活动参考。

  2. 您只能触摸黑带中提到的UI线程中的UI小部件。

  3. 对于它的价值而言,AsyncTask比简单Thread更容易使用。