@slavenski
Android developer

Как передать данные в основной поток из CallBack okhttp Android?

Добрый день!
Работаю над приложением Android, в целях изучения работы с JSON.
В качестве API пользуюсь вот этим - jsonplaceholder.typicode.com.

Так вот, мне нужно, чтобы в элементе списка RecyclerView отображалось тело поста и количество комментариев, собственно вот код:
MainActivity
public class MainActivity extends AppCompatActivity {


    public static final String TAG = MainActivity.class.getSimpleName();

    //Модель данных для постов
    private PlaceHolderPost placeHolderPost;
    //Список экземпляров постов
    List<PlaceHolderPost> posts = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Получаем RecyclerView
        final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv);

        //Получаем данные о постах
        String apiKeyPosts = "posts";
        int idPost = 1;
        String placeholderPostsURL = "https://jsonplaceholder.typicode.com/" + apiKeyPosts + "/";

        //Получаем данные о комментах
        String apiKeyComments = "comments";
        String placeholderCommentsURL = "https://jsonplaceholder.typicode.com/" + apiKeyComments;

        /*Проверка на наличие подключения к интернету*/
        if (isNetworkAvailable()) {
            OkHttpClient client = new OkHttpClient();

            Request requestPost = new Request.Builder()
                    .url(placeholderPostsURL)
                    .build();

            Request requestComments = new Request.Builder()
                    .url(placeholderCommentsURL)
                    .build();


            Call call = client.newCall(requestPost);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, final Response response) throws IOException {

                    final String jsonData = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                if (response.isSuccessful()) {
                                    Log.v(TAG, jsonData);

                                    posts = getCurrendDetails(jsonData);
                                    Log.e("placeholderPost", posts.size() + " - размер");
                                    PostDataAdapter adapter = new PostDataAdapter(MainActivity.this, posts);
                                    // устанавливаем для списка адаптер
                                    recyclerView.setAdapter(adapter);

                                } else {
                                    alertUserAboutError();
                                }
                            } catch (JSONException e) {
                                Log.e(TAG, "JSON Exception caught: ", e);
                            }
                        }
                    });
                }
            });
            //Log.e("placeholderPost", posts.size() + " - размер");
            //PostDataAdapter adapter = new PostDataAdapter(MainActivity.this, posts);
            // устанавливаем для списка адаптер
            //recyclerView.setAdapter(adapter);
        }
    }

    private ArrayList<PlaceHolderPost> getCurrendDetails(String jsonData) throws JSONException {

        JSONArray postJsonArray = new JSONArray(jsonData);

        ArrayList<PlaceHolderPost> postsList = new ArrayList<>();

        for (int i = 0; i < postJsonArray.length(); i++) {
            JSONObject entry = postJsonArray.getJSONObject(i);
            postsList.add(new PlaceHolderPost(
                    entry.getInt("userId"),
                    entry.getInt("id"),
                    entry.getString("title"),
                    entry.getString("body")
            ));
        }
        return postsList;
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();

        boolean isAvailable = false;

        if (networkInfo != null && networkInfo.isConnected()) {
            isAvailable = true;
        } else {
            Toast.makeText(this, getString(R.string.network_unavailable_message),
                    Toast.LENGTH_LONG).show();
        }

        return isAvailable;
    }

    private void alertUserAboutError() {
        AlertDialogFragment dialog = new AlertDialogFragment();
        dialog.show(getFragmentManager(), "error_dialog");
    }
}

PlaceHolderPost
package com.example.slave.firstappjson;

public class PlaceHolderPost {

    private int userId;
    private int id;
    private String title;
    private String body;

    PlaceHolderPost(int userId, int id, String title, String body)
    {
        this.userId = userId;
        this.id = id;
        this.title = title;
        this.body = body;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}


Проблема в том, что метод API post не возвращает кол-во комментариев, и мне нужно делать еще один Call для метода comments, но тогда я не могу заполнить корректно RecyclerView.
Думал над тем, чтобы передать данные в основной поток, но сколько не гуглил, не могу найти реализацию. Прошу помощи, люди добрые.
  • Вопрос задан
  • 256 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы