Android 如何同时使用ProgressDialog和异步任务get方法

Android 如何同时使用ProgressDialog和异步任务get方法,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,我有一个从服务器获取响应的通用异步任务类。我使用get方法接收这些响应。现在我知道当我使用get方法时UI线程是阻塞的,我的进度对话框并没有及时显示 现在有人能告诉我做这件事的替代方法吗??(在任何情况下,我都需要将响应发送回调用execute的活动,这样打开新活动对我都没有帮助) 代码: 异步任务类 public class GetDataFromNetwork extends AsyncTask<Void,String,Object> { protected void onP

我有一个从服务器获取响应的通用异步任务类。我使用get方法接收这些响应。现在我知道当我使用get方法时UI线程是阻塞的,我的进度对话框并没有及时显示

现在有人能告诉我做这件事的替代方法吗??(在任何情况下,我都需要将响应发送回调用execute的活动,这样打开新活动对我都没有帮助)

代码: 异步任务类

 public class GetDataFromNetwork extends AsyncTask<Void,String,Object> {

protected void onPreExecute() {
    super.onPreExecute();
    progressDialog.show();
} 


 protected Object doInBackground(Void... params) {
    Object result = null;
    try {
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
        new MarshalBase64().register(envelope);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(ipAddress + webService);
        System.setProperty("http.keepAlive", "true");
        try {
            androidHttpTransport.call(nameSpace + methodName, envelope);
        } catch (Exception e) {

            e.printStackTrace();
            publishProgress(e.getMessage());
        }
        androidHttpTransport.debug = true;
        System.out.println("response: " + androidHttpTransport.requestDump);
        result = envelope.getResponse();
        if(result!=null){
            System.out.println("GetDataFromNetwork.doInBackground() result expection---------"+result);
        }
    } catch (Exception e) {
        System.out.println("GetDataFromNetwork.doInBackground()-------- Errors");
        e.printStackTrace();

    }

    return result;
}

protected void onPostExecute(Object result) {
    super.onPostExecute(result);
    progressDialog.dismiss();
}

为什么不创建另一个类,在其中放置响应,并在其中使用get和set方法呢。然后在onPostExecute中,您使用set方法编写它,并调用一个处理程序,在那里您可以做任何您想做的事情……这只是一个想法……:)

如果您正在使用AsyncTask,您的UI线程将不会被阻止。您是否正在
doInBackground()
中下载数据?因为那是你应该做的

正如yorkw所说,问题在于您使用以下代码让UI线程等待响应:

response= (SoapObject)request.execute().get();
正如该文件所述:

如有必要,等待计算完成,然后检索 它的结果

由于UI线程等待响应,因此无法显示进度对话框。解决方案是将处理响应的代码移动到onPostExecute()方法:


收到响应后将调用此方法。同时,UI线程可以显示进度对话框。

我在应用程序中一直在做类似的事情,我发现最简单的方法是创建“回调”接口,并将其作为参数传递给我的“异步任务”。执行“doInBackground()”处理,完成后从onPostExecute调用“Callback”实例,并将“result”对象作为参数传递

下面是一个非常简化的版本

回调接口示例:

package example.app;

public interface Callback {

        void run(Object result);
}
使用上述回调接口的AsyncTask示例:

public class GetDataFromNetwork extends AsyncTask<Void,String,Object> {
  Callback callback;
  public GetDataFromNetwork(Callback callback){
     this.callback = callback;
  }

   protected void onPreExecute() {
      super.onPreExecute();
      progressDialog.show();
  } 


   protected Object doInBackground(Void... params) {
      Object result = null;
      // do your stuff here
      return result;
  }

  protected void onPostExecute(Object result) {
     callback.run(result);
     progressDialog.dismiss();
  }

}

最简单的解决方案是不要使用AsyncTask.get()并在AsyncTask实现中处理您的SoapObject响应(在doInBackground()或onPostExecute()中)@yorkw:谢谢,但您的解决方案是不可能的。例如:我的响应返回我需要的setAdapter()列表在一种情况下,它会发送一个类对象给我,在另一种情况下。因此,通用处理器是不可能的:(.是的,我正在这样做,请查看代码(刚才也添加了该代码)。问题在于.get()方法。为什么不使用处理程序机制?下载对象时,向UI线程发送一条消息。谢谢Jovan。我已经尝试过了,但在这种情况下,codecant中没有同步性。请使用通用处理器进行响应。其次,我如何将已处理的响应发送到父活动。然后在onPostExecute()取决于接收到的对象和/或配置GetDataFromNetwork时使用的参数。若要向父活动返回某些结果,请使用常用的activity.startActivityForResult()和activity.setResult()模式。可以从onPostExecute()调用activity.setResult()和activity.finish().1使用AsyncTask.onPostExecute(SoapObject result),2父活动中的内部类AsyncTask为您处理所有事情,在后台执行任务(独立线程),完成后,返回UI线程并执行您想要的任何操作。这就是为什么它调用AsyncTask。通过调用AsyncTask.get(),您可以同步执行它(ui线程等待后台线程).你能解释得更详细些吗?我会在我的答案中添加更多的细节,因为它不适合这里。如果可能的话,你能给我发邮件吗?我的id是mohit.1。sharma@silverskills.comI当我有时间的时候,我会试着用一些真实的代码示例写一篇教程,但是现在我只是在这里发布了一些简单的示例代码t帮助您。尝试将其调整到您的代码中,并让我知道它是否有效:)没问题。很高兴它有帮助:)
package example.app;

public interface Callback {

        void run(Object result);
}
public class GetDataFromNetwork extends AsyncTask<Void,String,Object> {
  Callback callback;
  public GetDataFromNetwork(Callback callback){
     this.callback = callback;
  }

   protected void onPreExecute() {
      super.onPreExecute();
      progressDialog.show();
  } 


   protected Object doInBackground(Void... params) {
      Object result = null;
      // do your stuff here
      return result;
  }

  protected void onPostExecute(Object result) {
     callback.run(result);
     progressDialog.dismiss();
  }

}
class Example {
   public onCreate(Bundle savedInstanceState){
      //initialize

      GetDataFromNetwork request = new GetDataFromNetwork(new Callback(){
                     public void run(Object result){
                             //do something here with the result
       }});
       request.execute();      
   }
}