2016-04-01 18 views
0

良い一日私は投稿が好きかどうかをチェックしたいのですが、このanswerの解決策は正しく動作しません。ImageViewをStringRequestで編集したものがありません

私はAsyncTaskクラスを使用して新しいソリューションを作成すると思うが、正しく動作しません。 ありがとうございました。

class Check extends AsyncTask<String , Void , Void > { 
    private ImageView e; 
    Check(ImageView e) 
    { 
     this.e=e; 
    } 
    @Override 
    protected Void doInBackground(String... params) { 
     int id =Integer.parseInt(params[1]); 
     requestQueue = Volley.newRequestQueue(context); 
     requestQueue.start(); 
     StringRequest request = new StringRequest(Request.Method.GET, params[0], new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       if (response.equals("yes")) 
       { 
        e.setImageResource(R.mipmap.love_post); 
        e.setTag(R.mipmap.love_post); 
       } else { 
        e.setImageResource(R.mipmap.empty_heart); 
        e.setTag(R.mipmap.empty_heart); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Volley", "Error "); 
      } 
     }); 
     return null; 
    } 

} 
+0

は、UIスレッドでありますAsynTaskを削除します。 リソースをイメージビューに設定するには、これを使用します。e.setImageDrawable(getResource()。getDrawable(R.drawable.love_post)); –

答えて

0

、以下のようなonPostExecute()メソッド内のビューを更新してみてください、doInBackgroundメソッド内のコードは、UIスレッドではありませんworkerThread、上で実行されます。

これは、バックグラウンドで自動的にワーカースレッドにその要求を範囲となるボレーのためAsyncTaskvolley requests queueを使用して余計です。

一つの方法は、あなたにhandler

Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (msg.what == 1) { 
      // do something change ui 
     } 
    } 
}; 

onResponse方法のを使用している:

// 1.init volley request queue 
// 2.construct a request 
// 3.add the request to volley request queue 

あなたがしたい変更のUI conpoments場合は、次の2つの方法があります。

コードは次のように提案しましたStringRequest

呼び出し

もう一つの方法は、runOnUiThread()' in you onResponse method of StringRequest`:あなたはあなたのUI関連のものを更新するので、あなたがボレーを呼び出している、これまでStringRequestのでAsynTaskのボレーの必要はスレッドとonResponceを()を処理しませんどのように

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // change ui 
    } 
}); 
+0

あなたのアイデアを説明してくれてありがとう、それは私の仕事です;) –

0

doInBackground()メソッド内でUIビューを更新することはできません。 doInBackground()は、UIスレッドではなくワーカースレッド上で実行されます。 AsyncTask

class Check extends AsyncTask<String , Void , Void > { 
    private ImageView e; 
    Check(ImageView e){this.e=e;} 
    @Override 
    protected String doInBackground(String... params) { 
     int id =Integer.parseInt(params[1]); 
    String responseText = ""; 
     requestQueue = Volley.newRequestQueue(context); 
     requestQueue.start(); 
     StringRequest request = new StringRequest(Request.Method.GET, params[0], new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
     responseText = response; 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Volley", "Error "); 
      } 
     }); 
     return responseText; 
    } 
    @Override 
    protected void onPostExecute(String response) { 
    if (response.equals("yes")){ 
        e.setImageResource(R.mipmap.love_post); 
        e.setTag(R.mipmap.love_post); 
       } else { 
        e.setImageResource(R.mipmap.empty_heart); 
        e.setTag(R.mipmap.empty_heart); 
       } 
    } 
} 
関連する問題