2017-02-08 9 views
2

Volley возвращает null значение.Почему Volley возвращает нулевое значение?

Я получаю ответ от Volley, но когда I'am пытается вернуть 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(); 


    } 
} 
+0

Можете ли вы разместить код вашего AndroidManifest.xml файла? –

+4

Это потому, что imageurl возвращается до обработки запроса. –

+0

@AnuragSingh не получил, пожалуйста, объясните. –

ответ

2

Вы не можете получить ImageUrl с функцией, как это. Поскольку запрос запускает Async и после этого он получает метод onResponse через некоторое время. Вы должны изменить свой метод на void, чтобы показать некоторую загрузку пользователю, и когда onReponse вызывается, продолжайте свой процесс из метода onResponse. Вам нужен интерфейс для обратного вызова и возврата его к фрагменту или активности. и из onResponse вы можете получить imageURl с сервера, а затем установить это в свой imageView.

Вот класс интерфейса обратного вызова:

public interface ResponseCallback { 
void onImageResponse(String imageURL); 
} 

СМИ Imageclass:

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

А вот образ загрузчика класс:

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(); 


    } 
} 
+0

Но мне нужно вернуть значения из этого метода. –

+0

@HIteshChauhan нет пути! вам нужно ждать ответа. это не может быть сделано сразу –

+1

Существует способ ... но обратный вызов лучше! Обратите внимание, что интерфейс CallBack может быть непосредственно обработан с помощью функции 'ImageLoader', поэтому нет большого количества обновлений для работы. – AxelH

2

Поскольку вы пытаетесь восстановить ImageUrl внутри фоновый поток (сам поток ImageLoader), поэтому вы можете заставить поток ждать вашего ответа для возврата

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

Здесь на самом деле вы ожидаете возвращения объекта в будущем. Таким образом вы делаете поток вызывающего абонента дождаться ответа ответа.

Примечание: Это должно быть сделано только в том случае, если вы пытаетесь сделать запрос Volley уже из Background Thread. НЕ ДЕЛАЙТЕ ЭТО В ГЛАВНОЙ РЕЗЬБЕ

+0

Этот ответ удовлетворяет первоначальным требованиям, однако я не уверен, что начинающий программист понимает использование будущих объектов. Может быть, какое-то дальнейшее объяснение подойдет здесь или какая-то ссылка на правильный сайт. Таким образом, вы решаете проблему один раз, но он не поймет, почему она работает, и я не смогу ее решить в следующий раз, боюсь. – abbath

Смежные вопросы