繁体   English   中英

永远不会调用AsyncTask“ onPostExecute”

[英]AsyncTask “onPostExecute” never gets called

我在所有帖子中搜索了几乎相同的问题,但找不到任何有用的信息:\\

我创建了自己的接口,以在MainActivity中实现“ TaskListener”。 我的想法是在AsyncTask完成后在主线程中运行onTaskComplete()方法。

我的界面:

public interface TaskListener {
    void onTaskComplete();
}

我的主要活动:

public class MainActivity extends Activity implements TaskListener{
      private MyAsyncTask myAsyncTask;

      protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);

           myAsyncTask = new MyAsyncTask(this);
           //Some other stuff here
      }

      private void aMethod(){
          myAsyncTask.execute(aString);//aString is of course defined
      }

      public void onTaskComplete(){
          MyClass tmpMyObject = null;
          try{
              tmpMyObject = myAsyncTask.get();
          }
          catch(Exception e){
              //...
          }
      }
}

MyAsyncTask:

public class MyAsyncTask extends AsyncTask<String, Void, MyClass>{
      private TaskListener taskListener;

      public MyAsyncTask(TaskListener taskListener){
           this.taskListener = taskListener;
      }

      protected MyClass doInBackground(String... aString){
           //Some code here
           MyClass myObject = new MyClass();
           return myObject;
      }

      @Override
      protected void onPostExecute(MyClass myObject){
           taskListener.onTaskComplete();
      }
}

如果运行我的应用程序,它将在doInBackground()处返回myObject ,但永远不会调用onPostExecute() 所以我在MainActivity尝试了一些类似的事情:

private void aMethod(){
      MyClass myObject = myAsyncTask.execute()
                                    .get();
}

使用此代码,将调用onPostExecute() 但是以这种方式,我的主线程不得不等待异步线程完成。

非常感谢

您能解释一下为什么您认为onPostExecute没有被调用吗?

我一直在使用它,从来没有任何问题。 请尝试以下。

@Override
protected void onPostExecute(MyClass myObject) {
    super.onPostExecute(myObject);
    // LOG some message or put a break point to see if you get called
    taskListener.onTaskComplete(myObject);
}

更改您的接口以接受MyClass作为参数。

 public void onTaskComplete(MyClass myObject){
  // Do whatever you need to do with myObject
    // LOG some message or put a break point to see if you get called

  }

之所以不调用它,是因为您没有将其传递给接口的回调方法。此外,get方法还将使您的主线程和后台线程同步。因此它将等待后台线程完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM