2017-01-11 12 views
0

Я пытаюсь получить URL-адрес изображения из json, затем используя этот URL-адрес для загрузки изображения. Но проблема заключается в том, что url получает так поздно/медленнее, что imagerequest reports urlFull имеет значение NULL. Даже после использования интерфейса DataCallback. Любое решение для этого, чтобы оба запроса выполнялись синхронно?Volley - Сделать запрос ждать предыдущего запроса для заполнения

Редактировать. Одна странная вещь, которую я заметил, это код работает отлично, когда я нажимаю кнопку второй раз. Но в первый раз он говорит, что URL-Bad Null

я поставил onclicklistener на кнопку, которая

звонки-
public void fetchSave(String photoJson) { 
    fetchData(new DataCallback() { 
     @Override 
     public void onBitmapSuccess(Bitmap result) { 
      Utils utils = new Utils(getActivity()); 
      utils.saveImageSDCard(result); 
     } 

     @Override 
     public void onJsonSuccess(JSONObject result) { 
      try { 
       JSONArray mediaContentArray = result.getJSONObject(TAG_ENTRY).getJSONObject(TAG_MEDIA_GROUP).getJSONArray(TAG_MEDIA_CONTENT); 
       JSONObject mediaObject = (JSONObject) mediaContentArray.get(0); 
       urlFull = mediaObject.getString(TAG_IMG_URL); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      Log.d(TAG, "Full image url " + urlFull); 
     } 
    }, photoJson); 
} 

fetchData() является следующим образом-

public void fetchData(final DataCallback callback, String photoJson) { 
    RequestFuture<JSONObject> future = newFuture(); 
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, photoJson, null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      Log.d(TAG, "JsonObject response= "+response.toString()); 
      callback.onJsonSuccess(response); 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(getActivity(), getString(R.string.toast_unknown_error), Toast.LENGTH_LONG).show(); 
     } 
    }); 

    jsonObjectRequest.setShouldCache(false); 
    AppController.getInstance().addToRequestQueue(jsonObjectRequest); 
    AppController.getInstance().getRequestQueue().getCache().remove(photoJson); 


     final ImageRequest imageRequest = new ImageRequest(urlFull, new Response.Listener<Bitmap>() { 
      @Override 
      public void onResponse(Bitmap response) { 
       Log.d(TAG, "Bitmap response"); 
       callback.onBitmapSuccess(response); 
      } 
     }, 0, 0, ImageView.ScaleType.CENTER_CROP, null, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(getActivity(), "Couldn't Download", Toast.LENGTH_SHORT).show(); 
       error.printStackTrace(); 

      } 
     }); 
     AppController.getInstance().addToRequestQueue(imageRequest); 
} 

ответ

1

Вы можете отправить второй запрос в методе первый запрос в onResponse(), так что вы будете уверены, что данные не нулевой

+0

Это сработало отлично. Благодаря! –

0

Volley поддерживает блокирование запрос через RequestFutures , Вы создаете обычный запрос, но устанавливаете его обратные вызовы в качестве своего будущего запроса, что является просто расширением волейбола стандартного фьючерса java. Вызов функции future.get() будет заблокирован.

Это выглядит примерно так

RequestFuture<JSONObject> future = RequestFuture.newFuture(); 
JsonObjectRequest request = new JsonObjectRequest(Method.POST, SIGNUP_URL, reqBody, future, future) 
volleyRequestQueue.add(request); 

try { 
    JSONObject response = future.get(); 
} catch (InterruptedException e) { 
} catch (ExecutionException e) { 
} 
+0

Пробовал это же ошибка есть. Он сообщает «Bad url null» –

+0

Вы уверены, что данные получены правильно, т. Е. OnResponse не является нулевым? –

+0

Пожалуйста, отметьте мое редактирование –