2016-05-11 5 views
2

Я пытаюсь сделать более объектно-ориентированную программу с помощью Volley. В настоящее время у меня проблема с невозможностью извлечь данные из метода onResponse волейбола.Возвращаемые значения из volley onResponse

private void getMember(String memberid){ 
    Response.Listener<String> responseListener = new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
       JSONObject jsonResponse = new JSONObject(response); 
       boolean success = jsonResponse.getBoolean("success"); //key["success"] 
       String userid = jsonResponse.getString("userid"); 
       if(success){ 
        byte[] decoded_img = Base64.decode(jsonResponse.getString("userpic"), Base64.DEFAULT); 
        Bitmap member_pic = BitmapFactory.decodeByteArray(decoded_img, 0, decoded_img.length); 
        FamMember member = new FamMember(jsonResponse.getString("username")); // creating new object 

////// where I need to capture the image/ any data that I get in the Json response/// 
        AlertDialog.Builder builder = new AlertDialog.Builder(LandingActivity.this); 
        builder.setMessage(member.username) 
          .setNegativeButton("Retry",null) 
          .create() 
          .show(); //properly displays newly created object 'username' 
       } else { 
        AlertDialog.Builder builder = new AlertDialog.Builder(LandingActivity.this); 
        builder.setMessage("Unable to Login") 
          .setNegativeButton("Retry",null) 
          .create() 
          .show(); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    //HAPPENS AFTER RESPONSE HAS BEEN GIVEN FROM SERVER//////// 
    MemberRequest memberRequest = new MemberRequest(type,memberid,responseListener); 
    RequestQueue queue = Volley.newRequestQueue(LandingActivity.this); 
    queue.add(memberRequest); //puts actual request into the queue for processing 
} 

Я должен быть в состоянии получить ответ и использовать их в качестве переменных, чтобы перейти в мою деятельность. Как мне это сделать, когда мне присваивается ошибка, что я не могу возвращать методы выше?

+0

проверить, является ли ответ нулевым или он имеет что-то –

+0

, он возвращает соответствующий ответ. Мне просто нужно получить его и использовать данные в другом месте в коде –

ответ

1

Создание глобальной переменной вне блока Volley

public String response_var=""; 

    public void getMember() 
    { 
    @Override 
    public void onResponse(String response) { 
    { 
response_var=response; 
    } 

    } 
+0

Есть некоторые случаи, когда такой подход не работает, например, когда вы создаете класс Singleton для Android Volley, и вам нужно дождаться завершения запроса Volley, для этого вы можете продолжить другие шаги вашего основного класса, например, для получения строки, хранящейся в «response_var». Для других ситуаций (все работает в одном классе, том же блоке кода и т. Д.), Кажется, работает отлично. – ivanleoncz

1

Volley и других библиотек асинхронный HTTP хорошо асинхронный. Ваша деятельность не может напрямую получить ответ HTTP. Вам необходимо обработать данные с помощью метода onResponse, а затем связаться с ним. Один из способов - отправить местную трансляцию.

+0

У вас есть пример о "отправке местной трансляции"? Стоит упомянуть некоторый код, так как вы привносите другой подход (что-то отличное), чтобы решить эту проблему. С уважением. – ivanleoncz

1

Вы можете создать метод, который отвечает за ответ (или часть ответа, который вы хотите) в качестве аргумента. Например:

private void processResponse(String encodedUserPic, String userName) { 

    // Use the response as you need 
    byte[] decodedImg = Base64.decode(encodedUserPic), Base64.DEFAULT); 
    Bitmap memberPic = BitmapFactory.decodeByteArray(decodedImg, 0, decodedImg.length); 
    FamMember member = new FamMember(userName); 
} 

Затем вы можете передать ответ на этот метод изнутри метода onResponse:

private void getMember(String memberid){ 
    Response.Listener<String> responseListener = new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     try { 
      JSONObject jsonResponse = new JSONObject(response); 
      boolean success = jsonResponse.getBoolean("success"); //key["success"] 
      String userid = jsonResponse.getString("userid"); 

      if(success){ 
       String encodedUserPic = jsonResponse.getString("userpic"); 
       String userName = jsonResponse.getString("username"); 
       // Callback: 
       processResponse(encodedUserPic, userName); 
       ... 
      } 
      ... 

Margin примечание: в Java, ниже CamelCase обозначения конвенции, а подчеркнутый.

Упование вы считаете это полезным!

+0

Итак, если я правильно следую этому методу, метод обратного вызова может принимать данные и перемещать их за пределы метода onResponse? Смогу ли я вернуть данные из обратного вызова, чтобы я мог использовать его в других частях программы? –

+0

Точно; то вы можете сделать все, что вам нужно, с ответом в методе processResponse() и использовать его во всем приложении. –

+0

Поскольку метод getMember() недействителен и не имеет возврата, как бы я мог каким-то образом вернуть результирующий объект, который я только что создал? Я поместил метод getMember(), но из-за Volley onResponse() я не могу вернуть объект, который я создал. –

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