0

발리를 사용하여 서버에 요청을 보내면 작동하지 않고 런타임 오류가 발생합니다.발리를 사용한 FirebaseMessagingService의 문자열 요청이 작동하지 않습니다.

public class MyFCMService extends FirebaseMessagingService { 
    String url, title, message; 
    String category_id; 

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    super.onMessageReceived(remoteMessage); 
    title = remoteMessage.getData().get("title"); 
    message = remoteMessage.getData().get("message"); 

    String id = remoteMessage.getData().get("ID"); 

    if (check(id).equals("6")) { 
     sendNotification(title, message); 
    } else { 
     sendNotification("khalid", "khalid"); 
    } 
} 

public String check(String id) { 
    url = "http://www.tobeacademy.com/api/get_post/?post_id=" + id; 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         JSONObject jsonObject = new JSONObject(response); 
         JSONArray array = jsonObject.getJSONArray("post"); 
         category_id = array.getJSONObject(0).getString("id"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
     } 
    }); 
    Volley.newRequestQueue(this).add(stringRequest); 

    return category_id; 
} 

답변

0

발리 요청이 비동기 적으로 완료됩니다. 청취자의 onResponse() 메소드는 tobeacademy 서버에서 reuqested 데이터를 수신 할 때까지 실행되지 않습니다.

즉, check() 메서드에서 반환 된 값은 청취자 onResponse()이 실행되고 정의되기 전에 반환되기 때문에 category_id에 의해 반환 된 값은 유효하지 않습니다.

당신은 이런 식으로 코드를 리팩토링해야

public void check(String id, final String title, final String message) { 
    url = "http://www.tobeacademy.com/api/get_post/?post_id=" + id; 

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        try { 
         JSONObject jsonObject = new JSONObject(response); 
         JSONArray array = jsonObject.getJSONArray("post"); 

         String category_id = array.getJSONObject(0).getString("id"); 

         if (category_id.equals("6")) { 
          sendNotification(title, message); 
         } else { 
          sendNotification("khalid", "khalid"); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
     } 
    }); 
    Volley.newRequestQueue(this).add(stringRequest); 
}