Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务“;onPostExecute";从未接到过电话_Java_Android_Multithreading_Android Asynctask - Fatal编程技术网

Java 异步任务“;onPostExecute";从未接到过电话

Java 异步任务“;onPostExecute";从未接到过电话,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我用几乎相同的问题搜索了所有的帖子,但没有找到任何有用的东西:\ 我制作了一个自己的接口,将“TaskListener”实现到我的MainActivity中。我的想法是在异步任务完成后,在主线程中运行onTaskComplete()-方法 我的界面: public interface TaskListener { void onTaskComplete(); } 我的主要活动: public class MainActivity extends Activity implements

我用几乎相同的问题搜索了所有的帖子,但没有找到任何有用的东西:\

我制作了一个自己的接口,将“TaskListener”实现到我的MainActivity中。我的想法是在异步任务完成后,在主线程中运行
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();
      }
}
使用此代码将调用
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方法将使主线程和后台线程同步。因此,它将等待后台线程完成。

IMHO,如果将
get()
AsyncTask
一起使用,这是一个主要的代码气味。您可能应该将返回值
myObject
传递回侦听器,与其打电话给
get
我该如何传回它?我不能在
doInBackground()
中这样做,否则我在一个类中有两个线程,这不是很好:D或者有其他方法吗?get方法将使主线程和后台线程同步。尝试过它,但它也从未到达登录
onPostExecute
:\
super.onPostExecute()
不是必需的。基本实现是空的。我真的很困惑。正如danny提到的,这应该很好。我能想到的唯一一件事是如何在构造函数中定义AsyncTask并在以后使用。这应该是好的,但在这个时候,你应该尝试任何事情。为什么不在使用AsyncTask之前定义它呢?也就是说,move myAsyncTask=newmyasynctask(this);在调用execute之前调用aMethod。这也是一个很好的编程实践;避免不必要的成员变量,并在更接近您需要的地方定义它们。根据matiash的评论编辑我的答案。我现在就这样做了(在使用它之前定义它),因为我必须不止使用一次;)但对于那些好奇的人来说:没有必要这么做。我在onCreate方法中发现了问题。在调用
onPostExecute()
之前,有一个错误的旧方法调用导致应用程序崩溃(上面没有这一行)。但我真的要感谢你,因为你上面的代码和你的帮助!=)我只是按照Raghu上面解释的那样做。“它”是什么意思?我必须向回调方法传递什么?对不起,我不太明白你的意思:\@amorpherCoder创建一个参数是的,就像Raghu刚才做的一样,但它不起作用。我也放弃了get方法,但没有任何改变。它只返回myObject,但从不调用postExecute@amorpherCoder您能获取myObject吗??在后台执行之后?是的,我可以将它设置为我的
MyAsyncTask
的公共属性,然后从那里获取它;)
 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

  }