我想在AsyncTask类中使用findViewById()方法...我试过onPostExecute()和onPreExecute()。但是它不起作用
class Proccess extends AsyncTask<String, Void, Void>{
@Override
protected Void doInBackground(String... arg0) {
TextView txt = (TextView) findViewById(R.id.tvResult); // cause error
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
TextView txt = (TextView) findViewById(R.id.tvResult); // cause error
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
TextView txt = (TextView) findViewById(R.id.tvResult); // cause error
}
}
答案 0 :(得分:2)
像这样编辑你的代码
class Proccess extends AsyncTask<String, Void, Void>{
@Override
protected Void doInBackground(String... arg0) {
TextView txt = (TextView) findViewById(R.id.tvResult); // cuse error
return null; //this should be the last statement otherwise cause unreachable code.
}
@Override
protected void onPreExecute() {
super.onPreExecute();
TextView txt = (TextView) findViewById(R.id.tvResult); // cuse error
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
TextView txt = (TextView) findViewById(R.id.tvResult); // cuse error
}
}
您的流程类应该是您的活动的内部类。 其他方面导致方法findViewById(int)未定义。
答案 1 :(得分:1)
你可以将你的视图传递给AsyncTask构造函数,如Can't access "findViewById" in AsyncTask中所提到的,虽然我认为只有一个弱引用应该保留,以防当onPostExecute被触发时视图不再存在(所以我们不要使用过时的视图或阻止其垃圾回收):
public class Process extends AsyncTask<String, Void, Void>{
private WeakReference<TextView> textViewRef;
public Process(TextView textView) {
this.textViewRef = new WeakReference<TextView>(textView);
}
@Override
protected Void doInBackground(String... params) {
// do your stuff in background
return null;
}
@Override
protected void onPostExecute(Void result) {
TextView textView = textViewRef.get();
if (textView != null) {
// do something with it
}
else {
// the view has been destroyed
}
}
}
没有时间立即检查它,但如果您的活动/片段将视图传递给asynctask,那应该这样做。
哦,顺便说一句:永远不要在doInBackground中以任何方式使用视图,因为此方法在后台线程上执行,而UI组件只能从主线程中操作。
答案 2 :(得分:0)
您应该在活动中获得对textview的引用,并将其存储为数据成员。它可以从内部AsyncTask访问。
在postExecute中使用findViewById的缺点是您的AsyncTask可能会在您的活动中断后终止,而findViewById会使您的应用程序崩溃。