在StringRequest中编辑ImageView没有更新任何内容



大家好,我想检查一下用户是否喜欢帖子,在这个答案中,解决方案无法正常工作。

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

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

AsyncTask中使用volley requests queue进行截击将自动将其请求范围扩展到后台的工作线程,这是多余的。

建议的代码如下:

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

在您的StringRequestonResponse方法中:

Message message = Message.obtain();
message.what = 1; // define a integer to stand for some situation
handler.sendMessage(message);

另一种方式,调用runOnUiThread()' in you onResponse method of StringRequest`:

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

您不能在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);
                }
     }
}

相关内容

最新更新