在编写向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);
. . . . . .
}
}
答案 0 :(得分:1)
在您的情况下,不是没有,因为只有UI Thread
可以触摸用户界面,您的代码会使您的应用程序崩溃
android.view.ViewRoot$CalledFromWrongThreadException
答案 1 :(得分:1)
将Activity
引用传递给线程有一些警告。活动生命周期与线程生命周期是分开的。可以销毁和重建活动,例如通过方向改变事件。如果活动引用在一个线程中保留,那么活动所拥有的资源(例如,大量位图资产占用大量内存)不是垃圾可收集的。
非静态内部类也存在同样的问题,因为对父项的引用是隐式的。
工作解决方案是在销毁活动时清除活动参考,并在重新创建活动时提供新的活动参考。
您只能触摸黑带中提到的UI线程中的UI小部件。
对于它的价值而言,AsyncTask
比简单Thread
更容易使用。