URLに接続してJSONを解析し、解析中に不確定なProgressDialogを表示し、その結果をキー値として返すためにAsyncTask拡張クラスを使用しようとしていますHashMap内のペアをメインアクティビティに追加します。 HashMapの結果は主アクティビティによって読み込まれ、フォームフィールドに入力されます。しかし、AsyncTask(printlnステートメントで証明)でHashMapを作成していても、HashMapを返すメインアクティビティのメソッドを呼び出すと空の結果が得られます。これが私が間違っていることか、AsyncTaskの機能を誤解しているかどうかはわかりません。Android - AsyncTaskの結果がメインアクティビティに返されない
AsyncTaskをアクティビティに拡張するクラスの変換を議論しています。基本的に、このデータの検索/解析中は何も実行できないはずです。また、ProgressDialogが離れてからアプリケーションと再び対話できるようになるまで待つ必要があります(または戻るボタンを押してください)。また、私のアプリケーションでは、例外がキャッチされた(URLに接続できない、悪いJSON、検索するプロダクトIDが見つからない)AsyncTaskの特定のケースを処理できる必要があり、カスタムエラーダイアログがそれらの例外に合わせて調整されています。例外がキャッチされたかどうかに応じて、finish()を呼び出すときに異なる結果コードを返すことができるので、このクラスがアクティビティであれば簡単にこれを行うことができます。
ここでも、AsyncTaskが最良の解決策であるかどうかはわかりません。なぜなら、情報が収集されて解析されている間、ユーザは何もしないからです。新しいアクティビティが意味をなさないか、私がバックグラウンドスレッドの実装を変更しているかどうかを教えてください。
MainActivity.java
public class ProductLookup extends AsyncTask<Object, Void, HashMap<String, String>> {
private String mProductID;
private Context mContext;
HashMap<String, String> mProductInfo;
ProgressDialog mDialog;
public ProductLookup(String id, Context applicationContext) {
mProductID = id;
mContext = applicationContext;
mProductInfo = new HashMap<String, String>();
}
@Override
protected void onPreExecute() {
mDialog = new ProgressDialog(mContext);
mDialog.setMessage("Loading product info. Please wait...");
mDialog.setIndeterminate(true);
mDialog.setCancelable(false);
mDialog.show();
}
@Override
protected void onPostExecute(HashMap<String, String> result){
super.onPostExecute(result);
mDialog.dismiss();
mProductInfo = result;
}
@Override
protected HashMap<String, String> doInBackground(Object... params) {
try {
// Connect to URL, parse JSON, and add key-value pairs to mProductInfo...
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
finally {
try {
// Close input/output reader variables
} catch (IOException e) {
e.printStackTrace();
}
}
return mProductInfo;
}
public HashMap<String, String> getProductInfo(){
return this.mProductInfo;
}
}
は、私は私がコンパイルさせませんのエラーを取得:子プライベートクラスとしてあなたMainActivityの内側にAsyncTask作成 – Keeb13r
「型MainActivityのエンクロージングインスタンスがスコープにアクセスできません」 。 – Pentium10
子プライベートクラスをどのように正確に作成しますか? – Keeb13r