Android 在StringRequest中编辑ImageView未更新任何内容
大家好,我想检查一下用户是否喜欢帖子,在这种情况下,解决方案不能正常工作 我认为使用AsyncTask类编写新的解决方案,但也不能正常工作。 非常感谢大家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
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));非常感谢你解释你的想法,,,这是我的工作;)