Android 在StringRequest中编辑ImageView未更新任何内容

Android 在StringRequest中编辑ImageView未更新任何内容,android,android-volley,Android,Android Volley,大家好,我想检查一下用户是否喜欢帖子,在这种情况下,解决方案不能正常工作 我认为使用AsyncTask类编写新的解决方案,但也不能正常工作。 非常感谢大家 class Check extends AsyncTask<String , Void , Void > { private ImageView e; Check(ImageView e) { this.e=e; } @Override protected Void

大家好,我想检查一下用户是否喜欢帖子,在这种情况下,解决方案不能正常工作

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

}
类检查扩展了异步任务{
私人影像;
检查(图像视图e)
{
这个。e=e;
}
@凌驾
受保护的Void doInBackground(字符串…参数){
int id=Integer.parseInt(参数[1]);
requestQueue=Volley.newRequestQueue(上下文);
requestQueue.start();
StringRequest=newStringRequest(request.Method.GET,params[0],new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
如果(响应等于(“是”))
{
e、 setImageResource(R.mipmap.love_post);
e、 setTag(R.mipmap.love_post);
}否则{
e、 setImageResource(R.mipmap.empty_heart);
e、 setTag(R.mipmap.empty_heart);
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.e(“截击”、“错误”);
}
});
返回null;
}
}

您不能在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);
                }
     }
}
类检查扩展了异步任务{
私人影像;
检查(ImageView e){this.e=e;}
@凌驾
受保护的字符串doInBackground(字符串…参数){
int id=Integer.parseInt(参数[1]);
字符串responseText=“”;
requestQueue=Volley.newRequestQueue(上下文);
requestQueue.start();
StringRequest=newStringRequest(request.Method.GET,params[0],new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
responseText=响应;
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.e(“截击”、“错误”);
}
});
返回响应文本;
}
@凌驾
受保护的void onPostExecute(字符串响应){
如果(响应等于(“是”)){
e、 setImageResource(R.mipmap.love_post);
e、 setTag(R.mipmap.love_post);
}否则{
e、 setImageResource(R.mipmap.empty_heart);
e、 setTag(R.mipmap.empty_heart);
}
}
}

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

AsyncTask
中使用
volley请求队列
是多余的,因为volley将自动将其请求范围扩展到后台的工作线程

代码建议如下:

// 1.init volley request queue
// 2.construct a request
// 3.add the request to volley request queue
如果您想更改UI组件,有两种方法:

一种方法是使用
处理程序

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            // do something change ui
        }
    }
};
在您的
onResponse
方法中
StringRequest

Message message = Message.obtain();
message.what = 1; // define a integer to stand for some situation
handler.sendMessage(message);
另一种方法是,在您的onResponse
方法
StringRequest`中调用
runOnUiThread()

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

无论您如何调用volley StringRequest,都不需要AsynTask volley来处理线程,而onResponse()是UI线程,因此您可以在此处更新与UI相关的内容并删除AsynTask。使用此选项将资源设置为imageview e.setImageDrawable(getResource().getDrawable(R.drawable.love_post));非常感谢你解释你的想法,,,这是我的工作;)