asyncTask中的findViewById()

时间:2013-07-26 06:31:41

标签: java android asynchronous

我想在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

    }
}

3 个答案:

答案 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会使您的应用程序崩溃。