【问题标题】:How use ProgressDialog and Async Task get Method simultaneously如何同时使用 ProgressDialog 和 Async Task get 方法
【发布时间】:2011-11-09 07:20:03
【问题描述】:

我有从服务器获取响应的通用异步任务类。我通过使用 get 方法收到这些响应。现在我知道当我使用 get 方法时 UI 线程被阻塞了,因为我的进度对话框没有按时显示。

现在有人可以告诉我这样做的替代方法吗? (在每种情况下,我都需要将响应发送回调用执行的活动,因此打开新活动对我没有帮助)

代码: 异步任务类

 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();
}

代码:活动

GetDataFromNetwork request = new GetDataFromNetwork(
                                        this,
                                        ProgressDialog.STYLE_SPINNER,
                                        getResources().getText(R.string.autenticate).toString());
response= (SoapObject)request.execute().get();

【问题讨论】:

  • 最简单的解决方案是不要使用 AsyncTask.get() 并在 AsyncTask 实现中处理您的 SoapObject 响应(在 doInBackground() 或 onPostExecute() 中)
  • @yorkw:谢谢,但您的解决方案是不可能的。例如:我的回复返回了一个列表,在一个案例中我需要 setAdapter(),并在另一个案例中向我发送一个类对象。所以通用处理器是不可能的:( .

标签: android android-asynctask progressdialog


【解决方案1】:

我在我的应用程序中一直在做这样的事情,我发现最简单的方法是创建“回调”接口并将其作为参数传递给我的“AsyncTask”。您进行“doInBackground()”处理,完成后从 onPostExecute 调用“回调”实例,将“结果”对象作为参数传递。

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

回调接口示例:

package example.app;

public interface Callback {

        void run(Object result);
}

上面使用Callback接口的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();
  }

}

如何在您的应用中使用上述类的示例:

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();      
   }
}

【讨论】:

  • 你能详细解释一下吗?
  • 我将在我的答案中添加更多细节,因为它不适合这里。
  • 如果可以的话,能否给我发邮件,我的身份证是 mohit.1.sharma@silverskills.com
  • 当我有时间的时候,我会尝试用一些真实的代码示例来写一篇关于如何做到这一点的教程,但现在我只是在这里发布了一些简单的示例代码。希望对你有帮助。尝试将其调整为您的代码,并让我知道它是否有效:)
  • 没问题。很高兴它有帮助:)
【解决方案2】:

就像 yorkw 说的,问题是你让 UI 线程等待响应代码:

response= (SoapObject)request.execute().get();

正如AsyncTask.get() 的文档所说:

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

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

protected void onPostExecute(Object result) {
    super.onPostExecute(result);

    // Now we have the response, dismiss the dialog and handle the response
    progressDialog.dismiss();
    response = (SoapObject) result;
}

此方法将在您得到响应后被调用。同时,UI 线程可以处理显示进度对话框。

【讨论】:

  • 不能有通用处理器来响应。其次,如何将已处理的响应发送到我的父活动。
  • 然后使 onPostExecute() 中的代码取决于您收到的对象和/或您配置 GetDataFromNetwork 的参数。要将某些结果返回给父活动,请使用通常的 Activity.startActivityForResult() 和 Activity.setResult() 模式。可以从 onPostExecute() 调用 Activity.setResult() 和 Activity.finish()。
  • 1 使用 AsyncTask.onPostExecute(SoapObject result),2 父活动中的内部类 AsyncTask 为您处理一切,在后台执行您的任务(单独的线程) ,一旦完成,返回并在 UI 线程上做任何你想做的事情。这就是它调用 AsyncTask 的原因,通过调用 AsyncTask.get() 可以使其同步(ui 线程等待 doInBackground 线程)。
【解决方案3】:

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

【讨论】:

  • 谢谢 Jovan。我已经尝试过了,但在这种情况下,我的代码中没有同步性
【解决方案4】:

如果您使用的是 AsyncTask,您的 UI 线程将不会被阻塞。你是在doInBackground() 里面下载你的数据吗?因为那是你应该做的地方。

【讨论】:

  • 是的,我正在做请看代码(刚刚也添加了)。问题在于活动类中的 .get() 方法。
  • 为什么不用Handler机制呢?下载对象后,向 UI 线程发送消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多