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

Java Android多线程,无法从Asynctask访问主线程,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,这个问题以前可能问过,但我在搜索中找不到 我在android应用程序中实现了一个活动,并且在此活动中使用了Asynctask类。我试图从Asynctask(doInBackgroung)对布局进行一些更改,因此我从前面提到的Asynctask中调用了runOnUiThread。这可以正常工作,但一旦我转到另一个活动并再次返回此活动,布局上的更改就不再发生 值得一提的是,我在移动到下一个活动时调用了asynctask.cancel(true),并在返回到包含所述asynctask的活动时重建该as

这个问题以前可能问过,但我在搜索中找不到

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

值得一提的是,我在移动到下一个活动时调用了
asynctask.cancel(true)
,并在返回到包含所述asynctask的活动时重建该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();
        }
    }
}
公共类MyActivity扩展SyncFinishedListener上的活动实现{
@凌驾
已完成的公共void(){
//用你的活动界面做一些事情
}
}
公共类MyAsyncTask扩展了AsyncTask{
私人OnAsyncFinishedListener mListener;
SyncFinishedListener上的公共静态接口{
void onsyncfinished();
}
公共MyAsyncTask(OnAsyncFinishedListener侦听器){
mListener=侦听器
}
@凌驾
PostExecute上受保护的void(void void){
if(mListener!=null){
mListener.onAsyncFinished();
}
}
}

返回原始任务时是否调用
.execute()
?此链接将帮助您了解当您在活动上调用setContentView()时,何时应该重新实例化对象,例如
AsyncTasks
,它将重新加载xml中定义的布局,忽略您对UI的更改,这是您的问题吗?我调用
.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,param)在活动的开头,在
onCreate()
中。我试图执行,但没有成功。@Nanoc不,这不是我的问题。返回活动时,我的RunNuithRead中放在asynTask(doInbackground)中的代码无法正常工作。这些代码应该会改变我的主布局中的一些图标。谢谢你的回答。我完全不理解我的问题逻辑。我尝试在Asynctask的doInBackground部分调用侦听器,因此,此Asynctask直到活动结束才完成。每次侦听器捕捉到预期的内容时,都会更改UI线程上的一些图标,然后再次开始侦听事件。为了管理UIthread,我必须在doInBackground方法中调用rununuithread。那没有任何意义。我建议你看看你是如何设计你的应用程序的。AsyncTasks应用于在后台线程上执行有限的作业,并将结果返回给主线程。如果您需要在后台持续工作并使用结果更新UI,我建议您使用绑定服务并遵循上述相同的接口模式。