2016-10-12 3 views
1

Ich habe versucht, Callback ähnlich wie meine Fragmente und andere Leute Vorschlag auf Rückrufe, aber ich hatte kein Glück, ich könnte die Rückrufe falsch machen. Der Toast innerhalb der onResponse-Methode von JsonArrayRequest gibt eine Array-Größe von 2 zurück. Aber ich bekomme 0 auf dem Toast außerhalb der Anfrage. consignment.class implementiert parcelZugriff auf Antwortdaten aus VolleyRequest, versuchte Callbacks

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

Aktivität Klasse:

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

Fehler:

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

Lesen Sie das bin ich unklar in dieser Zeile: arrayList = gson.fromJson (response.toString(), listType); Wo wird die Array-Listenvariable deklariert? –

+0

Aktualisiert den Code, Es ist an der Spitze der Klasse erklärt, Befolgen Sie dieses Video in youtube https://www.youtube.com/watch?v=bbwmviiqd3s, aber geringfügige Änderungen vorgenommen Callbacks zu implementieren –

Antwort

1

Also in diesem werde ich einen Stich nehmen - mit der Aktivität der Zuhörer implementieren, die Art und Weise ist ein bisschen seltsam, obwohl ich glaube nicht, dass das das Problem ist. Ich verstehe auch nicht, warum Sie den Listentyp auf eine Variable speichern wollen - ich habe noch nie jemanden gesehen, der das gemacht hat.

Allerdings, um zu Ihrer Frage über den Toast und warum es 0 ist - Wenn Sie sprechen über den Toast, der kommt nach dem getAllCons Aufruf-es ist, weil dieser Code vor dem Rückrufcode ausgeführt wird. schließt ab.

Versuchen Sie etwas wie das und sehen Sie, was es tut.

+0

Immer noch nichts .. Die Sendung .class implementiert parzellierbar. Beeinflusst das Dinge? Der Server reagiert immer noch mit einem 304-Status und jetzt habe ich diesen Fehler E/AndroidRuntime: Fatale Ausnahme: Main Prozess: com.angel.createcon, PID: 9295 android.content.res.Resources $ NotFoundException: String Ressource ID # 0x75bcd15 bei android.content.res.Resources.getText (Resources.java:1484) –

+0

Nein, Parcelable definiert nur eine Möglichkeit, die Daten für die Übertragung zwischen den Aktivitäten zu packen - die Verwendung von JSON zum Zusammensetzen sollte als völlig getrennt betrachtet werden. Was ist der Inhalt der String-Antwort, die Sie vor der Analyse erhalten? –

+0

danke seine Arbeit, ich glaube, es erklärte List in der TypeToken, Es sollte ArrayList gewesen sein. Jetzt nur Probleme mit Recyclerview binden. Sie haben gesagt, dass die Implementierung von Aktivitäten seltsam ist. Könnten Sie das bitte nur zur späteren Bezugnahme erklären? –

Verwandte Themen