0

onclickメソッド内にデイジーチェーン接続された一連のAlertDialogがあります。最後の1つでは、URLに呼び出しを送信し、応答を待つ必要があります。応答が戻ってきたら、応答のメッセージを受け取り、最後のAlertDialogを作成する必要があります。問題は、これが2.3 Androidで機能することですが、REST http呼び出しがUIスレッドで実行されるため、Android4.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://developer.android.com/reference/android/os/AsyncTask.htmlの開発者向けドキュメントをご覧くださいAsyncTask

あなたがそこに従うことができる例があります。基本的に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();
    }
}    

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