2010-12-02 13 views
9

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; 
    } 

} 

答えて

5

あなたに、ねじ実行し、その結果を待たない.execute()を発行

mInitiateProductLookupButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       ProductLookup pl = new ProductLookup(id, MainActivity.this); 
       pl.execute(); 

       // The below variable is always empty! 
       HashMap<String, String> productInfo = pl.getProductInfo(); 
       applyProductInfoToFormFields(productInfo); 
      } 
     }); 

ProductLookup.java。

これ以降のデータは、データがまだロードされていないため空です。

あなたはあなたのためにいくつかのミス概念がありMainActivity.this.setProductInfo(result)

+1

は、私は私がコンパイルさせませんのエラーを取得:子プライベートクラスとしてあなたMainActivityの内側にAsyncTask作成 – Keeb13r

+2

「型MainActivityのエンクロージングインスタンスがスコープにアクセスできません」 。 – Pentium10

+0

子プライベートクラスをどのように正確に作成しますか? – Keeb13r

3

セッターを経由して、あなたの活動に直接PostExecutedに結果を設定する必要があります。 AsyncTask.execute()の後のステートメントは、呼び出しの直後に実行されます。あなたのdoInBackgroundは他のスレッドで実行中です。ここでは、productInfoマップを使用しているときにdoInBackgroundが完了していないため、そこに結果が設定されていません。

簡単な解決方法は、onPostExecuteメソードの結果を使用することです。私はそれをしようとすると

protected void onPostExecute(HashMap<String, String> result){ 
     mDialog.dismiss(); 
     mProductInfo = result; 
applyProductInfoToFormFields(productInfo); 

    } 
+0

applyProductInfoToFormFields()メソッドはMainActivityにあり、そのクラスのデータメンバー(フォームフィールドを表す)に新しい値(例えばJSONから解析された値)を設定します。 。私はProductLookupからそのメソッドを呼び出すことができないと思いました。また、私はGUIを変更/相互作用するつもりなら、私はMainActivityからそれを続けなければならないと思いました。 ProductInfoは、新しいインスタンスを保存せずにフィールドのデータメンバーをどのように知っていますか? – Keeb13r

+0

私はあなたを正しく取得しません。私はあなたにGUIコントロールフォームapplyProductInfoToFormFields()にアクセスする必要があると思います。もしそうなら、すべてのGUIコンポーネントをグローバルに宣言してどこからでもアクセスできるようにするのが最善の方法です。 –

+0

MainActivityのデータメンバーをProductLookupからどのように参照できますか?彼らをグローバル化するために私は彼らのことを変える必要がありますか? – Keeb13r

関連する問題