0

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

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;

}
4

2 回答 2

1

您并没有真正具体说明问题是什么,但我假设您不确定如何实现AsyncTask.

查看开发人员文档:http AsyncTask: //developer.android.com/reference/android/os/AsyncTask.html

有一个例子,你可以按照那里。基本上,您希望doInBackground()在 AsyncTask 中进行 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();
于 2013-02-08T21:10:41.480 回答
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();
    }
}    

休息异步

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);
    }
}
于 2013-02-08T21:16:48.857 回答