2016-10-12 6 views
1

콜백을 사용하려고했는데 콜백에 대한 내 프래그먼트 및 다른 사람들의 제안과 유사하지만 콜백을 잘못 수행했을 수 있습니다. JsonArrayRequest의 onResponse 메서드 안에있는 Toast는 배열 크기가 2를 반환합니다.하지만 요청의 외부에서 건 축하에서 0을 얻습니다.VolleyRequest에서 응답 데이터에 액세스 할 수 없습니다. 콜백을 시도했습니다.

public class GetConsActivity extends AppCompatActivity { 
RecyclerView recyclerView; 
ConsAdapter adapter; 
RecyclerView.LayoutManager layoutManager; 
ArrayList<Consignment> arrayList; 
TextView txtView; 
BackgroundTask backgroundTask; 
Type listType; 
Gson gson; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_get_cons); 
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    gson = new Gson(); 
    listType = new TypeToken<ArrayList<Consignment>>(){}.getType(); 

    BackgroundTask backgroundTask = new BackgroundTask(GetConsActivity.this); 
    backgroundTask.getAllCons(new GetAllConsListener() { 
     @Override 
     public void onSuccess(String response) { 
      ArrayList<Consignment> list = parseResponse(response); 
      updateUI(list); 
      //Toast.makeText(GetConsActivity.this, "Consignments:"+arrayList.size(), Toast.LENGTH_LONG).show(); 

      Log.d("ONSUCCESS", "ARRAYSIZE: "+arrayList.size()); 

     } 
    }); 


} 

public ArrayList<Consignment> parseResponse(String response){ 
    ArrayList<Consignment> list = new ArrayList<>(); 
    try { 
     JSONArray jsonArray = new JSONArray(response); 

     Log.d("PARSE", "parseResponse: "+jsonArray.length()); 
     JSONObject jsonObject = jsonArray.getJSONObject(0); 
     for (int i = 0; i<jsonArray.length();i++){ 

      Consignment con = null; 

      Log.d("PARSE", "parseID: "+jsonObject.getInt("conid")); 
      con.setConid(jsonObject.getInt("conid")); 

      Log.d("PARSE", "conID: "+con.getConid()); 
      con.setDescription(jsonObject.getString("description")); 

      list.add(con); 

     } 
     Log.d("PARSED", "parsedResponse: "+list.size()); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    //arrayList =gson.fromJson(response,new TypeToken<ArrayList<Consignment>>(){}.getType()); 
    //updateUI(arrayList); 
    return list; 
} 

public void updateUI(ArrayList<Consignment> consignments){ 
    this.arrayList = consignments; 
    Log.d("UPDATE", "parseResponse: "+consignments.size()); 
    if (adapter == null) { 
     adapter = new ConsAdapter(consignments,GetConsActivity.this); 
     recyclerView.setAdapter(adapter); 
    }else{ 
     adapter.setConsignments(consignments); 
     adapter.notifyDataSetChanged(); 
    } 
} 

가 오류 : - 활동이 방식은 리스너를 구현하는 데

D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000, [1440x2560]-format:1 
E/RecyclerView: No adapter attached; skipping layout 
I/qtaguid: Untagging socket 51 
D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 84 - 0, 0) vi=Rect(0, 84 - 0, 0) or=1 
E/RecyclerView: No adapter attached; skipping layout 
D/PARSE: parseResponse: 4 
D/PARSE: parseID: 123456789 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.angel.createcon, PID: 26952 
        java.lang.NullPointerException: Attempt to invoke virtual method 'void com.angel.createcon.Consignment.setConid(int)' on a null object reference 
         at com.angel.createcon.GetConsActivity.parseResponse(GetConsActivity.java:80) 
         at com.angel.createcon.GetConsActivity$2.onSuccess(GetConsActivity.java:56) 
         at com.angel.createcon.BackgroundTask$2.onResponse(BackgroundTask.java:50) 
         at com.angel.createcon.BackgroundTask$2.onResponse(BackgroundTask.java:47) 
         at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
         at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
         at android.os.Handler.handleCallback(Handler.java:739) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:148) 
         at android.app.ActivityThread.main(ActivityThread.java:7331) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
I/Process: Sending signal. PID: 26952 SIG: 9 
Application terminated. 
+0

이 글을 읽는 데는 다음과 같은 것이 분명합니다. arrayList = gson.fromJson (response.toString(), listType); 배열 목록 변수는 어디에 선언 되었습니까? –

+0

코드가 업데이트되었습니다. 클래스 상단에서 선언되었습니다. https://www.youtube.com/watch?v=bbwmviiqd3s에서이 동영상을 보았습니다. 그러나 콜백을 구현하기 위해 약간 변경되었습니다. –

답변

1

그래서 나는이에 자상 할게요 consignment.class는 parcelable

public class BackgroundTask{ 
String json_url; 
Gson gson; 
Type listType; 
ProgressDialog pDialog; 

ArrayList<Consignment> arrayList = new ArrayList<>(); 
AppController appController; 
ConsAdapter adapter; 
Context context; 
public BackgroundTask(Context context){ 
    this.context = context; 
    listType = new TypeToken<List<Consignment>>(){}.getType(); 
    appController = AppController.getInstance(); 
    gson = new Gson(); 
} 

public void getAllCons(final GetAllConsListener callBack) { 
    String tag_json_obj = "json_obj_req"; 
    //showProgressDialog(); 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, json_url,null, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        callBack.onSuccess(response.toString()); 
        //hideProgressDialog(); 
        Toast.makeText(context, "Consignments:"+arrayList.size(), Toast.LENGTH_LONG).show(); 


       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      //Toast.makeText(context, "Error...", Toast.LENGTH_SHORT).show(); 
      error.printStackTrace(); 
      //hideProgressDialog(); 
     } 
    }); 


    appController.addToRequestQueue(jsonArrayRequest); 
} 

활동 클래스를 구현 조금 이상하다. 그러나 나는 그것이 문제라고 생각하지 않는다. 또한 왜 목록 유형을 변수에 저장하기로 결정했는지 이해하지 못합니다. 이전에는 아무도 보지 못했습니다.

그러나 토스트에 대한 질문과 이유는 0입니다. getAllCons 호출 후에 오는 축약에 대해 이야기하는 경우 해당 코드는 콜백 코드 전에 실행되기 때문입니다. 완료됩니다.

다음과 같이 시도해보십시오.

public class BackgroundTask{ 

String json_url; 
Gson gson; 
Type listType; 
Context context; 

public BackgroundTask(Context context){ 
    this.context = context; 
    listType = new TypeToken<List<Consignment>>(){}.getType(); 
    appController = AppController.getInstance(); 
    gson = new Gson(); 
} 

public void getAllCons(final GetAllConsListener callBack) { 
    String tag_json_obj = "json_obj_req"; 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, json_url,null, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        callBack.onSuccess(response.toString()); 
        Toast.makeText(context, "Consignments:"+arrayList.size(), Toast.LENGTH_LONG).show(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      error.printStackTrace(); 
     } 
    }); 


    appController.addToRequestQueue(jsonArrayRequest); 
} 


public class GetConsActivity extends AppCompatActivity { 

    RecyclerView recyclerView; 
    ConsAdapter adapter; 
    RecyclerView.LayoutManager layoutManager; 

    TextView txtView; 
    BackgroundTask backgroundTask; 
    Gson gson; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_get_cons); 
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    gson = new Gson(); 

    BackgroundTask backgroundTask = new BackgroundTask(GetConsActivity.this); 
    backgroundTask.getAllCons(new GetAllConsListener() { 
     @Override 
     public void onSuccess(String response) { 
      List<Consignment> values = parseResponse(response); 
      updateUI(values); 
     } 
    }); 

//code may execute here but callback is not yet complete. 
} 

public List<Consignment> parseResponse(String response){ 
    return gson.fromJson(response,listType); 
} 

private void updateUI(List<Consignment> consignments){ 
    if(adapter == null){ 
     adapter = new ConsAdapter(consignments) 
     recyclerView.setAdapter(adapter); 
    } else { 
     adapter.consignments = consignments; 
     adapter.notifyDataSetChanged(); 
    } 
} 
+0

아직 아무것도 ... 위탁 .class는 parcelable을 구현합니다. 그게 사물에 영향을 미칩니 까? 서버가 여전히 304 상태로 응답하고이 오류가 발생했습니다. E/AndroidRuntime : FATAL 예외 : 주 프로세스 : com.angel.createcon, PID : 9295 android.content.res.Resources $ NotFoundException : 문자열 리소스 ID # 0x75bcd15 android.content.res.Resources.getText (Resources.java:1484) –

+0

아니요, Parcelable은 액티비티간에 전송할 데이터를 포장하는 방법을 정의합니다. JSON을 사용하여 어셈블하는 것은 완전히 분리 된 것으로 간주해야합니다. 구문 분석하기 전에 얻은 문자열 응답의 내용은 무엇입니까? –

+0

덕분에 그것의 작업, 나는 List TypeToken, ArrayList 있어야합니다 선언했다 생각합니다. 이제는 recyclerview와 바인딩 문제. 당신은 실행하는 활동이 이상하다고 말했습니까? 나중에 참조 할 수 있도록 설명해 주시겠습니까? –

관련 문제