Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Android活动的对象传递给线程类';建造师?_Android_Multithreading_Android Activity - Fatal编程技术网

将Android活动的对象传递给线程类';建造师?

将Android活动的对象传递给线程类';建造师?,android,multithreading,android-activity,Android,Multithreading,Android Activity,在编写向web服务器提交输入查询的Android活动时,我在想,与其使用匿名内部类来定义网络线程,为什么我们不能使用单独的类来扩展线程 虽然这是预期的效果,但我想知道这是好的还是坏的做法 public class GreetActivity extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); se

在编写向web服务器提交输入查询的Android活动时,我在想,与其使用匿名内部类来定义网络线程,为什么我们不能使用单独的类来扩展线程

虽然这是预期的效果,但我想知道这是好的还是坏的做法

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线程
可以触摸UI,您的代码会使应用程序崩溃

android.view.ViewRoot$CalledFromWrongThreadException
  • 活动
    引用传递给线程有一些警告。活动生命周期与线程生命周期是分开的。活动可以通过方向更改事件等方式进行销毁和重新创建。如果活动引用保存在线程中,则该活动所保存的资源(例如大量位图资产,占用大量内存)不可垃圾回收

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

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

  • 您只能在blackbelt提到的UI线程中触摸UI小部件


  • 值得一提的是,一个
    异步任务
    比一个简单的
    线程

    更容易使用,谢谢您提供的信息。然而,当我执行代码时,它成功地执行了。我将尝试了解更多的原因,并更新线程。这是寻找一个视图。改变内容是错误的@拉尔托的回答真的很好