2016-09-15 4 views
0

Я только начал писать свое первое приложение для Android, и у меня возникли проблемы. Я не знаю, как правильно обрабатывать HTTP-ответ. Я нашел способ создания запроса GET (с okhttp) и нашел способ обработать ответ с помощью Callable. Я получаю массив своих объектов, а затем нужно создать новый адаптер для RecycleView (с этим массивом), но я не могу установить адаптер из основного потока. Я не знаю, как получить данные из этой Callable.Обработка HTTP-ответа HTTP

Создание запроса

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

Установка адаптера

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

И Excexption

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

Может быть, я должен сделать это не в статическом контексте?

+0

Пожалуйста, пост код, чтобы проиллюстрировать то, что вы до сих пор. –

ответ

0

Запись одного класса, как показано ниже,

класса MyTask {

// создать интерфейс для обратного вызова

// Код записи для удаленной работы

// раз дистанционное управление сделано дать обратный вызов к вашей деятельности по связыванию

// не забывайте отвязывать свою деятельность от этого класса, так как это приведет к утечке памяти, поскольку мы Если ваша активность будет на стадии остановки, она выйдет из строя, так как вам не разрешено обновлять интерфейс после завершения обратного вызова, поэтому удалите этот вызов на остановке.

}

0

так же, как это, и будет найти это работало

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) { 
    } 
} 
Смежные вопросы