【问题标题】:Is it a good practice to pass an object of Android Activity to a Thread class' constructor?将 Android Activity 的对象传递给 Thread 类的构造函数是一种好习惯吗?
【发布时间】:2014-01-23 09:21:51
【问题描述】:

在编写将输入查询提交到 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);
         . . . . . . 
    }

}

【问题讨论】:

    标签: android multithreading android-activity


    【解决方案1】:
    1. Activity 引用传递给线程有一些注意事项。活动生命周期与线程生命周期是分开的。活动可以被销毁和重新创建,例如通过方向改变事件。如果 Activity 引用保存在线程中,则 Activity 持有的资源(例如大量位图资产,占用大量内存)不是可垃圾回收的。

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

      一个可行的解决方案是在活动被销毁时清除活动引用,并在重新创建活动时提供新的活动引用。

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

    不管怎样,AsyncTask 比简单的 Thread 更容易使用。

    【讨论】:

      【解决方案2】:

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

      android.view.ViewRoot$CalledFromWrongThreadException
      

      【讨论】:

      • 感谢您的信息。但是,当我执行代码时,它已成功执行。我会尝试更多地了解原因并更新线程。
      • 找找View。更改其内容是错误的。 @lallto 的回答真的很好
      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 2011-11-07
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多