2

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

    }
}
4

3 回答 3

2

Edit your code like this

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

}
}

And your Process class should be innerclass of Your Activity. other wise it cause method findViewById(int) is undefined.

于 2013-07-26T06:42:26.873 回答
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
        }
    }
}

现在没有时间检查它,但应该这样做,前提是您的活动/片段将视图传递给异步任务。

哦,顺便说一句:永远不要在 doInBackground 中以任何方式使用视图,因为此方法在后台线程上执行,并且 UI 组件只能从主线程中操作。

于 2013-07-26T06:50:18.833 回答
0

您应该在活动中获取对 textview 的引用并将其存储为数据成员。它可以从内部 AsyncTask 访问。

在 postExecute 中使用 findViewById 的缺点是,您的 AsyncTask 可能会在您的活动结束后终止,然后 findViewById 会使您的应用程序崩溃。

于 2013-07-26T06:35:10.370 回答