2016-09-15 5 views
0

Ich habe gerade angefangen zu schreiben meine erste Android-App und ich habe ein Problem. Ich weiß nicht, wie man eine HTTP-Antwort richtig behandelt. Ich habe einen Weg gefunden, eine GET-Anfrage zu erstellen (mit okhttp) und den Weg gefunden, die Antwort mit Callable zu behandeln. Ich bekomme Array meiner Objekte und muss dann einen neuen Adapter für RecycleView (mit diesem Array) erstellen, aber ich kann den Adapter nicht vom Haupt-Thread aus einstellen. Ich weiß nicht, wie man Daten von diesem Callable bekommt.Android-Behandlung HTTP-Antwort

Antrag

public static void getDonerPoints() { 
    try { 

     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder() 
       .url("http://192.168.2.64:9000/donerPoint/get?count=100&orderBy=rating&orderDirection=asc") 
       .build(); 

     client.newCall(request).enqueue(
       new Callback() { 
        @Override 
        public void onFailure(Call call, IOException e) { 
         Log.d("mLog", "request error"); 
        } 

        @Override 
        public void onResponse(Call call, Response response) throws IOException { 
         try { 
          final ArrayList<DonerPoint> points = new ArrayList<>(); 
          if (response.code() == HttpURLConnection.HTTP_OK) { 
           JSONArray jsonArray = new JSONArray(response.body().string()); 
           ObjectMapper mapper = new ObjectMapper(); 
           for (int i = 0; i < jsonArray.length(); i++) 
            points.add(mapper.readValue(jsonArray.getString(i), DonerPoint.class)); 

           ListFragment.setNewContentForAdapter(points); 
           Log.d("mLog", "ok"); 
          } 
         } catch (Exception exc) { 
          Log.d("mLog", exc.toString()); 
         } 
        } 
       }); 

    } catch (Exception exc) { 
    } 
} 

Rahmen Adapter

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.list_tab, container, false); 
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.rv); 

    mLayoutManager = new LinearLayoutManager(getContext()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    return rootView; 
} 

public static void setNewContentForAdapter(List<DonerPoint> points){ 
    mAdapter=new PointAdapter(points); 
    mRecyclerView.setAdapter(mAdapter); 
} 

Und Excexption

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Vielleicht brauche ich es nicht in statischen Kontext zu tun?

+0

Bitte schreiben einige Code zu veranschaulichen, was Sie bisher haben. –

Antwort

0

wie unten einzelne Klasse schreiben,

Klasse MyTask {

// Schnittstelle für Rückruf erstellen

// Schreibcode für die Fernbedienung

// einmal Fernbedienung Rückruf geben getan zu Ihrer verbindlichen Aktivität

// Vergessen Sie nicht, Ihre Aktivität von dieser Klasse zu lösen, da dies zu einem Speicherverlust führen wird Wenn Ihre Aktivität in der Endphase ist, wird sie abstürzen, da Sie die Benutzeroberfläche nach dem Beenden des Rückrufs nicht aktualisieren können. Entfernen Sie diesen Aufruf bei Stop.

}

0

genau wie dieser, wird u finden es

arbeitete
public static void getDonerPoints() { 
    try { 

     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder() 
       .url("http://192.168.2.64:9000/donerPoint/get?count=100&orderBy=rating&orderDirection=asc") 
       .build(); 

     client.newCall(request).enqueue(
       new Callback() { 
        @Override 
        public void onFailure(Call call, IOException e) { 
         Log.d("mLog", "request error"); 
        } 

        @Override 
        public void onResponse(Call call, Response response) throws IOException { 
         try { 
          new android.os.Handler(Looper.getMainLooper()).post(new Runnable() { 
          @Override 
           public void run() { 
           final ArrayList<DonerPoint> points = new ArrayList<>(); 
           if (response.code() == HttpURLConnection.HTTP_OK) { 
           JSONArray jsonArray = new JSONArray(response.body().string()); 
           ObjectMapper mapper = new ObjectMapper(); 
           for (int i = 0; i < jsonArray.length(); i++) 
            points.add(mapper.readValue(jsonArray.getString(i), DonerPoint.class)); 

           ListFragment.setNewContentForAdapter(points); 
           Log.d("mLog", "ok"); 
          } 
         } 
       }); 
         } catch (Exception exc) { 
          Log.d("mLog", exc.toString()); 
         } 
        } 
       }); 

    } catch (Exception exc) { 
    } 
}