为什么 Volley 返回空值?
Why Volley is returning null value?
Volley 是 returning null
值。
我收到来自 Volley 的回复,但是当我尝试 return imageurl 时,它显示null
值。不知道为什么请大家帮忙
源代码如下:
public class Mediaimage {
String imageurl;
Context context;
public Mediaimage(Context context) {
this.context = context;
}
public String getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestqueue.add(stringrequest);
Log.i("imageurl",""+imageurl);
return imageurl;
}
}
NewsView.java 文件代码
public class Imageloader implements Runnable {
@Override
public void run() {
Mediaimage mediaimages = new Mediaimage(NewsView.this);
contentimage_again = mediaimages.getimageurl(featuredmedia);
// contentimage_again = getimageurl(featuredmedia);
Log.i("jhggggggggggggggggj",""+contentimage_again);
synchronized (this){
try {
wait(4000);
// Log.i("jhggggggggggggggggj",""+contentimage_again);
ImageLoader.getInstance().displayImage(contentimage_again, contentimage);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Toast.makeText(getApplicationContext(), "hehe"+contentimage_again, Toast.LENGTH_SHORT).show();
}
}
你不能用这样的函数获取imageUrl。因为请求 运行 Async 并且在一段时间后它收到了 onResponse 方法。您必须更改您的方法以取消向用户显示一些加载,并且当调用 onReponse 时从 onResponse 方法继续您的过程。您需要一个用于回调的接口,并且 return 将其分段或 activity。从 onResponse 中,您可以从服务器获取 imageURl,然后将其设置为您的 imageView。
这里是回调接口class:
public interface ResponseCallback {
void onImageResponse(String imageURL);
}
媒体图片class:
public class MediaImage {
String imageurl;
Context context;
ResponseCallback callback;
public Mediaimage(Context context, ResponseCallback callback) {
this.context = context;
this.callback=callback;
}
public void getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
callback.onImageResponse(imageurl);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestqueue.add(stringrequest);
}
}
这是图片加载器 class:
public class Imageloader implements Runnable {
@Override
public void run() {
Mediaimage mediaimages = new Mediaimage(NewsView.this);
mediaimages.getimageurl(featuredmedia, new ResponseCallback() {
@Override
public void onImageResponse(String imageUrl) {
ImageLoader.getInstance().displayImage(imageUrl, contentimage);
}
});
// contentimage_again = getimageurl(featuredmedia);
Log.i("jhggggggggggggggggj", "" + contentimage_again);
// Toast.makeText(getApplicationContext(), "hehe"+contentimage_again, Toast.LENGTH_SHORT).show();
}
}
由于您试图在后台线程(ImageLoader 线程本身)中检索 imageUrl,因此您可以让线程等待您对 return
的响应
public String getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestFuture<String> future = RequestFuture.newFuture();
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, future , future);
requestqueue.add(stringrequest);
try {
String response = future.get(10, TimeUnit.SECONDS); // Blocks for at most 10 seconds.
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
return imageurl;
} catch (InterruptedException e) {
// Exception handling
} catch (ExecutionException e) {
// Exception handling
} catch (TimeoutException e) {
e.printStackTrace();
}
Log.i("imageurl",""+imageurl);
return null;
}
这里实际上是在等待未来对象对return的响应。这样您就可以让调用者线程等待响应 returned.
注意:仅当您尝试从后台线程发出 Volley 请求时才应执行此操作。不要在主线程中执行此操作
Volley 是 returning null
值。
我收到来自 Volley 的回复,但是当我尝试 return imageurl 时,它显示null
值。不知道为什么请大家帮忙
源代码如下:
public class Mediaimage {
String imageurl;
Context context;
public Mediaimage(Context context) {
this.context = context;
}
public String getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestqueue.add(stringrequest);
Log.i("imageurl",""+imageurl);
return imageurl;
}
}
NewsView.java 文件代码
public class Imageloader implements Runnable {
@Override
public void run() {
Mediaimage mediaimages = new Mediaimage(NewsView.this);
contentimage_again = mediaimages.getimageurl(featuredmedia);
// contentimage_again = getimageurl(featuredmedia);
Log.i("jhggggggggggggggggj",""+contentimage_again);
synchronized (this){
try {
wait(4000);
// Log.i("jhggggggggggggggggj",""+contentimage_again);
ImageLoader.getInstance().displayImage(contentimage_again, contentimage);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Toast.makeText(getApplicationContext(), "hehe"+contentimage_again, Toast.LENGTH_SHORT).show();
}
}
你不能用这样的函数获取imageUrl。因为请求 运行 Async 并且在一段时间后它收到了 onResponse 方法。您必须更改您的方法以取消向用户显示一些加载,并且当调用 onReponse 时从 onResponse 方法继续您的过程。您需要一个用于回调的接口,并且 return 将其分段或 activity。从 onResponse 中,您可以从服务器获取 imageURl,然后将其设置为您的 imageView。
这里是回调接口class:
public interface ResponseCallback {
void onImageResponse(String imageURL);
}
媒体图片class:
public class MediaImage {
String imageurl;
Context context;
ResponseCallback callback;
public Mediaimage(Context context, ResponseCallback callback) {
this.context = context;
this.callback=callback;
}
public void getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
callback.onImageResponse(imageurl);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestqueue.add(stringrequest);
}
}
这是图片加载器 class:
public class Imageloader implements Runnable {
@Override
public void run() {
Mediaimage mediaimages = new Mediaimage(NewsView.this);
mediaimages.getimageurl(featuredmedia, new ResponseCallback() {
@Override
public void onImageResponse(String imageUrl) {
ImageLoader.getInstance().displayImage(imageUrl, contentimage);
}
});
// contentimage_again = getimageurl(featuredmedia);
Log.i("jhggggggggggggggggj", "" + contentimage_again);
// Toast.makeText(getApplicationContext(), "hehe"+contentimage_again, Toast.LENGTH_SHORT).show();
}
}
由于您试图在后台线程(ImageLoader 线程本身)中检索 imageUrl,因此您可以让线程等待您对 return
的响应public String getimageurl(String id){
String url="http://www.mytre.com/wp-json/wp/v2/media/"+id;
RequestFuture<String> future = RequestFuture.newFuture();
RequestQueue requestqueue = Volley.newRequestQueue(context);
StringRequest stringrequest = new StringRequest(Request.Method.GET, url, future , future);
requestqueue.add(stringrequest);
try {
String response = future.get(10, TimeUnit.SECONDS); // Blocks for at most 10 seconds.
imageurl=response;
JSONObject jsonObject = new JSONObject(response);
String j = jsonObject.getString("guid");
jsonObject = new JSONObject(j);
imageurl =jsonObject.getString("rendered");
return imageurl;
} catch (InterruptedException e) {
// Exception handling
} catch (ExecutionException e) {
// Exception handling
} catch (TimeoutException e) {
e.printStackTrace();
}
Log.i("imageurl",""+imageurl);
return null;
}
这里实际上是在等待未来对象对return的响应。这样您就可以让调用者线程等待响应 returned.
注意:仅当您尝试从后台线程发出 Volley 请求时才应执行此操作。不要在主线程中执行此操作