Android多线程,无法从Asynctask访问主线程

时间:2015-11-03 15:18:13

标签: java android multithreading android-asynctask

此问题可能之前已经提出过,但我通过搜索无法找到它。

我在我的android应用程序中实现了一个活动,并且在此活动中也使用了Asynctask类。我尝试从Asynctask(doInBackgroung)对我的布局进行一些更改,因此我从上面提到的Asynctask调用了runOnUiThread。这可以正常工作,但是一旦我移动到另一个活动并再次返回此活动,布局上的更改就不会再发生了。

值得一提的是,在移动到下一个活动时我调用asynctask.cancel(true)并在移回包含提到的Asynctask的活动时重建该asynctask。

请指导我如何处理这个问题。

1 个答案:

答案 0 :(得分:0)

如果不查看代码就很难说,但我建议您不要在asyncTask中调用runOnUiThread()。相反,在AsyncTask类中创建一个接口,并在构造AsyncTask类时传入实现接口的活动。然后在onPostExecute()内检查你的监听器(即实现你的接口的活动)是否为null并在该接口上调用一个方法 - 然后在活动内的实现方法内,在正确的线程上处理还可以检查您是否仍然拥有正确的UI元素,或者根据需要通过ID查找它们。

public class MyActivity extends Activity implements OnAsyncFinishedListener {

    <... activity stuff ...>

    @Override
    public void onAsyncFinished() {
      // do stuff with your activity ui
    }
}

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    private OnAsyncFinishedListener mListener; 

    public static interface OnAsyncFinishedListener {
        void onAsyncFinished();
    }

    public MyAsyncTask(OnAsyncFinishedListener listener) {
      mListener = listener
    }

    <... async task stuff ...>

    @Override
    protected void onPostExecute(Void void) {
        if (mListener != null) {
            mListener.onAsyncFinished();
        }
    }
}