2017-01-17 17 views
-6

ここではAsyncTaskという結果の値を取得する方法はありますか。onPostExcecuteの結果の値をonCreateに取得する方法

public class JSONPicture extends AsyncTask<String,String,String> { 

    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 

      connection.connect(); 

      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 

      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

      String finalJSON =buffer.toString(); 

      JSONObject parentObject = new JSONObject(finalJSON); 
      JSONArray parentArray = parentObject.getJSONArray("tbl_user"); 

      JSONObject finalObject = parentArray.getJSONObject(0); 


      String firstname = finalObject.getString("userImage"); 

      return firstname; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     try { 
      com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(result, ivUser); 
      Log.d(TAG, result); 
     }catch (IllegalArgumentException e){ 
      Log.d(TAG,e.toString()); 
     } 
    } 
} 

私はこのようにonStartで呼び出しています。だから私は読み込むことができます。私は画像の文字列を取得したいロードするとき。

@Override 
protected void onStart() { 
    super.onStart(); 

    new JSONPicture().execute("http://carkila.esy.es/carkila/profile/profileImage.php?username="+pref.getString("username","").toString()); 

} 

このような画像をクリックすると、画像のURLを取得したいと考えています。

 ivUser.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.d(TAG, ivUser.toString); 


     } 
    }); 

答えて

3

あなたはしません。 AsyncTaskの目的は、並行して実行することです。結果を待つ場合は、AsyncTaskを使用する必要はありません。 UIスレッドを強制的に待機させることで、アプリケーションをユーザーに無反応のままにしておきます。長すぎると、ウォッチドッグタイマーのためにアプリがクラッシュする可能性があります。

正しい方法は、結果を必要とするすべてのロジックをonPostExecuteに配置することです。必要な場合は、ローディングバーやその他のUI要素を配置して、結果が得られるまでアプリが待機していることを示します。

+0

偉大な、+1 ..! * Androidタグのトップユーザーとしても、この短い質問にお答えできますか? **クラス**または**ファイル**または**プロジェクト**ごとに、1つの 'public static void main(){}'メソッドを持つべきですか? – Shafizadeh

+1

どちらもありません。メインはデスクトップJavaで使用され、アンドロイドでは使用されません。基本的にmainはあなたのためにアンドロイドフレームワークで書かれています。あなたのエントリーポイントはランチャーアクティビティのonCreateです –

0

より機械的な方法を使用して、アプリケーションの任意の場所から取得できるキャッシュストレージに値を格納することができます。私はtinyDBをお勧めします。

` 'com.mukesh:tinydb:1.0.1' コンパイルのGradle

TinyDB tinyDB = new TinyDB(getApplicationContext()); 

tinyDB.putString("key",value); 

、あなたのコード行を使用してアプリ内で任意の場所から値を取得することができます。

tinyDB.getString("key"); 

機械的ではあるが効率的です。最初にonCreateで非同期タスクメソッドを呼び出し、tinyDB.getStringを呼び出します。 onPostExecuteからtinyDBに文字列を格納します。

関連する問題