問題は、Android フォンとサーバーと通信する方法です。これにより、Activity が残され、Activity での呼び出しが成功しなかった場合に、トランザクションがもう一度自動的に繰り返されます。ちょうど今、Android の AsyncTask を使用してサーバーと通信します。
new AsyncTask<String, Void, List<String>>() {
@Override
protected void onPreExecute(
showWaitDialog();
}
@Override
protected void onPostExecute(List<String> msgList) {
//here I put the handling after the POST ie. error and success handling
hideWaitDialog();
if (msgList.isEmpty() {
//success handling --> starting an new Activity
} else {
errorView.setText (...);
errorLayout.setVisibility (View.VISIBLE);
}
}
@Override
protected List<String> doInBackground(String... params) {
List<String> msgs = new ArrayList<String>();
try{
//for example submitting an JSONObject
JSONObject result = HttpUtils.sendHttpPost(
AppConstants.WEB_URL, jsonObject);
//error handling on the result
boolean hasErrors = JsonResult.isOk(result);
if (hasErrors) {
// adding errors to msgs list
String[] errorMessages = JsonResult.getErrorMessages (result,...);
fillList (msgs, errorMessages);
return msgs;
}
} catch (CommunicationError er) {
msgs.add (er...);
}
return msgs;
}
}
このアプローチの問題は、データの送信が成功しない場合、同じアクティビティにとどまらなければならないことです。今まで私はユーザーにエラーメッセージを表示し、ボタンで結果をサーバーに再度送信することを担当していました。私が探しているのは、送信が行われなかった場合に後で実行されるメモリに永続的に残るアクティビティです。
アプリケーションのケースとして、これを使用して、ウェイポイントを押した場合にマップ内のウェイポイントの写真を動的にアップロードします。場合によっては、モバイル サービス プロバイダーへの接続が利用できないことがあります (山、森、アンテナから遠く離れた場所)。次に、マップ アクティビティを終了して、このウェイポイントの詳細ビューに切り替えます。成功した場合は、画像をモデル クラスに入れ、シリアル化します。ユーザーが同じウェイポイントを再度クリックしても、画像は再度読み込まれません。成功しない場合、ユーザーがウェイポイントをクリックして画像を取得するのを待ちたくありません。実際、バックグラウンド タスクが必要です。既に訪れたウェイポイントの写真を表示するための何らかのキューが必要です。通信部分が肯定的な結果を返し、画像をモデルに書き込めるようになるまで、取得されないデータが読み込まれます。次にユーザーがウェイポイントを押すと、画像が表示されます。
このようなコードの実装を行うためのベスト プラクティスはありますか? 周りに例はありますか?これを行うより良い方法はありますか?