0

我有需要将异步任务作为内部方法运行的对象(不在 ui 线程上),我想将 ui 线程传递给该方法,然后以这种方式在 asynctask 上实现 ui 线程 - 有没有办法这样做?

伪代码:

      public class EditDetails extends Activity{          
                MyObject obj = new obj;
                obj.syncWithServer(EditDetails.this);
      }

      public class MyObject {
           public void syncWithWerver(EditDetails parent){
                 final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
                        @Override
                        protected String doInBackground(String... params) {
                             return "";
                        }
                        @Override
                        protected String onPostExecute(String result) {
                              //this doesn't run
                        }
                 }
           }
      }          

注意:目前这不起作用,因为 onPostExecute 在 doInBackground 之后没有触发

编辑

这段代码是伪代码,实际问题仍在发生,我在这里列出了它http://pastebin.com/jW6JpUbg .. 基本上它在从不执行 onPostExecute 的 pastebin 上运行第 72 行后卡住了

4

2 回答 2

2

onPostExecute应该是够奇怪的void。我想知道你的代码是如何编译的,因为你改变了被覆盖方法的返回类型?

更正后,您onPostExecute可以AsyncTask按如下方式运行:

final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
        @Override
        protected String doInBackground(String... params) {
             return "";
        }
        @Override
        protected String onPostExecute(String result) {
              // this will run
        }
} 
public void syncWithWerver(EditDetails parent){
     AsyncTask task = new GetUserHttpTask();
     task.execute();
}
于 2013-04-22T11:31:13.670 回答
1

你试过这样执行你的任务吗?

parent.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            new GetUserHttpTask().execute();
        }
});

我认为这应该工作..

添加:

您的AsyncTask实施应如下所示:注意:阅读更新的评论

class GetUserHttpTask extends AsyncTask<String/* in parameter for doInBackground */, Boolean /* in parameter for onProgressUpdate */, String /* Out parameter and in parameter for onPostExecute method*/> {
    @Override
    protected String doInBackground(String... params) {
        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        // this doesn't run
    }

    @Override
    protected void onProgressUpdate(Boolean... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }
}
于 2013-04-22T11:32:44.100 回答