为什么 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 请求时才应执行此操作。不要在主线程中执行此操作