【问题标题】:Android Multi-Threading, Main thread is not accesable from AsynctaskAndroid多线程,无法从Asynctask访问主线程
【发布时间】:2015-11-03 15:18:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 回到原来的任务时,你是在打电话.execute()吗? github.com/xxv/android-lifecycle此链接将帮助您了解何时应该重新实例化对象,例如AsyncTasks
  • 当您在活动上调用 setContentView() 时,它将重新加载 xml 中定义的布局,忽略您对 UI 的更改,这是您的问题吗?
  • 我在活动开始时调用.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, param);,在onCreate()。我试过.execute,但没有成功。
  • @Nanoc 不,这不完全是我的问题。返回活动时,我的 runOnUIthread 中放置在 asynTask(doInbackground) 中的代码无法正常工作。这些代码应该会改变我主要布局中的一些图标。

标签: java android multithreading android-asynctask


【解决方案1】:

不看你的代码很难说,但我建议你不要在你的 asyncTask 中调用runOnUiThread()。相反,在 AsyncTask 类中创建一个接口,并在构造 AsyncTask 类时传入实现该接口的活动。然后在onPostExecute() 内部检查您的侦听器(即实现您的接口的活动)是否不为空并在该接口上调用一个方法 - 然后这将在活动内部的已实现方法内处理,在正确的线程上,您也可以检查您是否还有正确的 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();
        }
    }
}

【讨论】:

  • 感谢您的回答。我完全不明白我的问题逻辑。我尝试在 Asynctask 的 doInBackground 部分中调用侦听器,因此此 Asynctask 直到活动结束才完成。每次侦听器捕捉到预期的内容时,都会更改 UI 线程上的一些图标,然后再次开始侦听事件。为了管理 UIthread,我必须在我的 doInBackground 方法中调用 runOnUIthread。
  • 再一次,我认为您不应该在 doInBackground 中调用 runOnUi。这没有任何意义。我建议你看看你是如何设计你的应用程序的。 AsyncTasks 应该用于在后台线程上执行有限的工作并将结果返回给主线程。如果您需要在后台持续工作并使用结果更新 UI,我建议您使用绑定服务并遵循与上述相同的界面模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多