在StringRequest中编辑ImageView没有更新

时间:2016-04-01 09:16:41

标签: android android-volley

我希望检查用户是否喜欢发帖的好日子,在此answer解决方案无法正常运行。

我认为使用 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;
    }

}

2 个答案:

答案 0 :(得分:0)

您无法在doInBackground()方法中更新UI视图。 doInBackground()在工作线程上运行而不在UI线程上运行。尝试更新onPostExecute()方法中的视图,如下所示,

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

答案 1 :(得分:0)

AsyncTask中,doInBackground方法中的代码在workerThread上运行,而不是UI线程。

volley requests queue中使用AsyncTask进行排球多余会自动将其请求范围扩展到后台的工作线程。

代码建议如下:

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

如果您想更改UI配置,您有两种方式:

一种方法是使用handler

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

使用onResponse的{​​{1}}方法:

StringRequest

另一种方式,调用Message message = Message.obtain(); message.what = 1; // define a integer to stand for some situation handler.sendMessage(message); onResponse runOnUiThread()' in you StringRequest`:

method of