Java 确保异步线程在ui线程上运行

Java 确保异步线程在ui线程上运行,java,android,Java,Android,我有一些对象(不在ui线程上)需要作为内部方法运行异步任务,我希望将ui线程传递给该方法,然后以这种方式在异步任务上实现ui线程——有没有办法做到这一点 伪代码: public class EditDetails extends Activity{ MyObject obj = new obj; obj.syncWithServer(EditDetails.this); }

我有一些对象(不在ui线程上)需要作为内部方法运行异步任务,我希望将ui线程传递给该方法,然后以这种方式在异步任务上实现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
                        }
                 }
           }
      }          
公共类EditDetails扩展活动{
MyObject obj=新obj;
对象syncWithServer(EditDetails.this);
}
公共类MyObject{
public void syncWithWerver(编辑详细信息父项){
最后一个类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这个不能运行
}
}
}
}          
注意:目前这不起作用,因为onPostExecute在doInBackground之后没有启动

编辑

此代码是伪代码。实际问题仍在发生,我已经列出了它。。基本上,在运行pastebin中的第72行之后,它会被卡住,而不会执行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();
}
final类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这将运行
}
} 
public void syncWithWerver(编辑详细信息父项){
AsyncTask task=new GetUserHttpTask();
task.execute();
}
奇怪到应该是
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();
}
final类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这将运行
}
} 
public void syncWithWerver(编辑详细信息父项){
AsyncTask task=new GetUserHttpTask();
task.execute();
}

您是否尝试过这样执行任务

parent.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            new GetUserHttpTask().execute();
        }
});
我认为这应该行得通

添加:

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

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);
    }
}
类GetUserHttpTask扩展了AsyncTask{ @凌驾 受保护的字符串doInBackground(字符串…参数){ 返回“”; } @凌驾 受保护的void onPostExecute(字符串结果){ //这个不能运行 } @凌驾 受保护的void onProgressUpdate(布尔值){ //TODO自动生成的方法存根 super.onProgressUpdate(值); } }
您是否尝试过这样执行任务

parent.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            new GetUserHttpTask().execute();
        }
});
我认为这应该行得通

添加:

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

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);
    }
}
类GetUserHttpTask扩展了AsyncTask{ @凌驾 受保护的字符串doInBackground(字符串…参数){ 返回“”; } @凌驾 受保护的void onPostExecute(字符串结果){ //这个不能运行 } @凌驾 受保护的void onProgressUpdate(布尔值){ //TODO自动生成的方法存根 super.onProgressUpdate(值); } }
@PareshMayani不,该方法始终返回void。参数类型为changed@Perception如果我不认为这是解决整个问题的关键,我会将其作为评论发布。基本上,他没有正确地声明onPostExecute
onPostExecute,因此它没有被触发。@PareshMayani Yes@Boris是正确的。
onPostExecute
的返回类型应为
void
。结果类型
String
用于
doInBackground
方法而不是
onPostExecute
method是的,很抱歉它返回了
void
它是一个typo@user2083181我在我的报告中增加了额外的建议answer@PareshMayani不,该方法总是返回void。参数类型为changed@Perception如果我不认为这是解决整个问题的关键,我会将其作为评论发布。基本上,他没有正确地声明onPostExecute
onPostExecute,因此它没有被触发。@PareshMayani Yes@Boris是正确的。
onPostExecute
的返回类型应为
void
。结果类型
String
用于
doInBackground
方法而不是
onPostExecute
method是的,很抱歉它返回了
void
它是一个typo@user2083181我在回答中添加了额外的建议,您应该更改Boris提到的
onPostExecute
方法的返回类型,并尝试上述方法代码片段。它应该可以工作。我添加了这个代码段-我无法让onPostExecute运行,但是结果发生在doInBackground中,所以没关系。我在结果响应中使用“ok”代码手动运行它。您应该更改Boris提到的
onPostExecute
方法的返回类型,然后尝试上面的代码段。它应该可以工作。我已经添加了这个代码段-我无法让onPostExecute运行,但是结果发生在doInBackground中,所以没关系。我在结果响应中使用“ok”代码手动运行了它