0

我有一系列在onclick方法中以菊花链方式连接的AlertDialog。在最后一个我需要发送一个URL调用并等待响应。一旦响应回来,我需要采取响应的消息并创建最后一个AlertDialog。问题是在2.3 Android中有效,但由于REST http调用在UI线程上运行,所以最新更改了Android 4.0错误。所以我想把它移到一个AsyncTask。我通读了教程,但还没有找到我的具体困境。这里是我的代码:我如何使AlertDialog等待响应,并等待显示ProgressDialog或Spinner?我在寻找优雅的地方,AsyncTask是一个通用调用,可以在其他情况下用于REST调用。Inner AlertDialog调用REST URL,我如何等待进度对话返回

public void onClick(View view) { 

    if(alert != null && alert.isShowing()) { 
     break; 
    } 

    alert = new AlertDialog.Builder(this) 
    .setTitle(getResources().getString(R.string.alertPingTitle1).toString()) 
    .setMessage(getResources().getString(R.string.alertPingMessage1).toString()) 
    .setPositiveButton(getResources().getString(R.string.alertPingPositive1).toString(), 
    new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (onClicked) { 
       log.info("Preventing multiple clicks to Ping Node Id"); 
       return; 
      } 

      onClicked = true; 
      String returnMessage = ""; 
      int iconId = 0; 
      try { 
       String url = String.format(getResources().getString(R.string.urlIdPing).toString(), getRestUrl(), getId()); 

       // This is where the Rest call will happen in an AsyncTask 
       AsyncRest rest = new AsyncRest(Preferences.this); 
       rest.execute(new RestObject(type,null,null,true,false)); 

      .......................... 

       // This is the current state of the 2.3 code 
       JSONObject sent = RestRequest.sendPost(RestHttp.createHttpClient(), url, null, true); 
       if (sent != null && sent.getInt("response") == 200) { 
        returnMessage = "VALID REST call "; 
        iconId = android.R.drawable.ic_dialog_info; 
       } else { 
        if (sent != null) { 
         returnMessage = "INVALID REST response " + "\n\n Response code: " + sent.getInt("response"); 
        } else { 
         returnMessage = "INVALID REST call."; 
        } 
        iconId = android.R.drawable.ic_dialog_alert; 
       } 
      } catch(JSONException e) { 
       returnMessage = "Errored in JSON payload."; 
      } 

      alert = new AlertDialog.Builder(SetPreferences.this) 
      .setTitle(getResources().getString(R.string.alertPingTitle2).toString()) 
      .setMessage(returnMessage) 
      .setIcon(iconId) 
      .setPositiveButton(getResources().getString(R.string.alertOkay).toString(), 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) {} 
      }).show(); 

     } 
    }) 
}).show(); 

onClicked = false; 

} 

回答

1

你并没有真正具体地指定的问题是什么,但我猜想那就是你不知道如何实现AsyncTask

看一看的开发人员文件AsyncTaskhttp://developer.android.com/reference/android/os/AsyncTask.html

有,您可以按照有一个例子。基本上,你希望在AsyncTask的doInBackground()之内有你的REST调用。然后,在通话结束后对UI所做的任何更改都会在onPostExecute()之后进行。

编辑:详细

private class AsyncRest extends AsyncTask<String, Void, Void> { 
    protected Void doInBackground(String... url) { 
    // do your REST call here 
    return null; 
    } 

    protected void onPostExecute(Void nothing) { 
    // update your UI here 
    } 
} 

要执行,请拨打new AsyncRest().execute(url);

要获得的后台任务的结果做出的get()调用后执行。

AsyncRest rest = new AsyncRest(SetPreferences.this); 
rest.execute(new RestObject(Constants.ROTypes.post,url,null,null,true,false)); 
JSONObject sent = rest.get(); 
+0

编辑的问题要问更具体的一个。我已经在使用AysyncTasks,不知道如何让警报等待AsyncTask产生回调,因为这些警报是嵌入的,并且在Activity的onClick方法中。如果需要,我也可以发布我的AsyncTask。 – JPM 2013-02-08 21:14:30

+0

在'onPostExecute'上发出信号提示关闭或任何需要它的提示 – howettl 2013-02-08 21:15:26

+0

我已经知道所有这些了,但是我不知道如何在async被触发时让代码中的警报等待它不会暂停UI线程。 – JPM 2013-02-08 21:19:11

1

使用的AsyncTask您的代码会是这个样子:

在您的活动......

public MyActivity extends Activity implements AsyncRestCallback { 

    public void onClick(View view) { 

     if(alert != null && alert.isShowing()) { 
      break; 
     } 

     alert = new AlertDialog.Builder(this) 
     .setTitle(getResources().getString(R.string.alertPingTitle1).toString()) 
     .setMessage(getResources().getString(R.string.alertPingMessage1).toString()) 
     .setPositiveButton(getResources().getString(R.string.alertPingPositive1).toString(), 
     new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       if (onClicked) { 
        log.info("Preventing multiple clicks to Ping Node Id"); 
        return; 
       } 

       onClicked = true; 
       String returnMessage = ""; 
       int iconId = 0; 
       String url = String.format(getResources().getString(R.string.urlIdPing).toString(), getRestUrl(), getId()); 

       AsyncRest rest = new AsyncRest().execute(url); 
      }) 
    }).show(); 

    onClicked = false; 

    } 

    @Override 
    public void finished(String returnMessage) { 

     alert = new AlertDialog.Builder(SetPreferences.this) 
     .setTitle(getResources().getString(R.string.alertPingTitle2).toString()) 
     .setMessage(returnMessage) 
     .setIcon(iconId) 
     .setPositiveButton(getResources().getString(R.string.alertOkay).toString(), 
     new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) {} 
     }).show(); 
    } 
}  

RestAsync

public class AsyncRest extends AsyncTask<String, Integer, String> { 

    private AsyncRestCallback callback; 

    public AsyncRest(AsyncRestCallback callback) { 

     this.callback = callback; 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String returnMessage = ""; 
     String url = params[0] 

     try { 

      JSONObject sent = RestRequest.sendPost(RestHttp.createHttpClient(), url, null, true); 
      if (sent != null && sent.getInt("response") == 200) { 
       returnMessage = "VALID REST call "; 
       iconId = android.R.drawable.ic_dialog_info; 
      } 
      else { 
       if (sent != null) { 
        returnMessage = "INVALID REST response " + "\n\n Response code: " + sent.getInt("response"); 
       } 
       else { 
        returnMessage = "INVALID REST call."; 
       } 
       iconId = android.R.drawable.ic_dialog_alert; 
      } 
     } catch(JSONException e) { 
      returnMessage = "Errored in JSON payload."; 
     } 

     return returnMessage; 
    } 

    @Override 
    protected void onPostExecute(String returnMessage) { 

     callback.finished(returnMessage); 
    } 

    public interface AsyncRestCallback { 

     public void finished(String returnMessage); 
    } 
} 
+0

呃这是丑陋的,与此问题是,我试图做一个通用的异步类不是一个具体到这一个任务,我有10个人相似,但可能会或可能不包括警报和所有不同的图标和标题。 – JPM 2013-02-08 21:21:13

+1

如果你想创建一个通用的类,你可以在你的AsyncTask类中添加一个'interface',它在完成时被调用。 – 2013-02-08 21:23:14

+0

编辑答案以反映此实施。 – 2013-02-08 21:26:39