Комплекс вопросов : Timber в RxJava, DataBase в RxJava, присвоение RecyclerViewAdapter DataBase объектам в RxJava

194
10 сентября 2018, 13:30

Цель: Конвертировать список Api объектов в roomDataBase объекты и присваивать RecyclerViewAdapter уже roomDataBase объектам. И все это делать , не в основном потоке с помощью RxJava.

Timber почему то не выводит в логи "DbArticle insert" в SportNewsFragment поэтому не понимаю вставились у меня объекты в DB или нет.

Вообщем, туплю 4ый день. Спасибо. Прилагаю SportNewsFragment , RecyclerViewAdapter, Converter, Api class - Article, DataBase classes

public class SportNewsFragment extends Fragment {
    RecyclerView recyclerView;
    RecyclerViewAdapter adapter;
    Converter converter;
    ArticleDao articleDao;
    CompositeDisposable compositeDisposable = new CompositeDisposable();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_sportnews, container, false);
        recyclerView = view.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new RecyclerViewAdapter();
        recyclerView.setAdapter(adapter);
        return view;
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ApiClient apiClient = new ApiClient();
        Timber.d("onViewCreated");
        apiClient.getArticleList("us", "sports")
                .map(sportNews -> sportNews.articles)
                .map(articleList -> converter.convert(articleList))
                .map(dbArticles -> articleDao.insert(dbArticles))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext (don->Timber.d("DbArticle inserted"));
        ????????????????????????????????????????????????????

    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        compositeDisposable.dispose();
    }
}
//    public void showError(String errorMessage) {
//        Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
//        Timber.d(errorMessage);
//    }

//        apiClient.getArticleList("us", "sports").enqueue(new Callback<SportNews>() {
//            @Override
//            public void onResponse(Call<SportNews> call, Response<SportNews> response) {
//                if (response.isSuccessful()) {
//                    SportNews responseBody = response.body();
//                    if (responseBody != null) {
//                        List<Article> articlesFromApi = responseBody.articles;
//
//
//                        adapter.setArticleList(articlesFromApi);
//                        adapter.notifyDataSetChanged();
//                    } else {
//                        showError("responseBody == null ");
//                    }
//                } else {
//                    showError("no Response " + response.code());
//                }
//            }
//
//            @Override
//            public void onFailure(Call<SportNews> call, Throwable t) {
//                showError(t.getMessage());
//            }
//        });
//    }

@Entity 
public class DbArticle { 
    @PrimaryKey(autoGenerate = true) 
    public int id; 
    public String author; 
    public String title; 
    public String description; 
    public String url; 
    public String urlToImage; 
    public String publishedAt; 
} 
 
 
<!-- begin snippet: js hide: false console: true babel: false -->

@Database(version = 2, entities = {DbArticle.class}, exportSchema = false) 
public abstract class AppDatabase extends RoomDatabase { 
    abstract public ArticleDao articleDao(); 
}

public class Converter { 
 
    public static List<DbArticle> convert(List<Article> articleList) { 
        List<DbArticle> dbArticleList = new ArrayList<>(); 
        for (Article article : articleList) { 
            DbArticle dbArticle = new DbArticle(); 
            dbArticle.author = article.author; 
            dbArticle.description = article.description; 
            dbArticle.publishedAt = article.publishedAt; 
            dbArticle.title = article.title; 
            dbArticle.url = article.url; 
            dbArticle.urlToImage = article.urlToImage; 
            dbArticleList.add(dbArticle); 
        } 
        return dbArticleList; 
    } 
}

public class Article { 
 
    @SerializedName("source") 
    public Source source; 
    @SerializedName("author") 
    public String author; 
    @SerializedName("title") 
    public String title; 
    @SerializedName("description") 
    public String description; 
    @SerializedName("url") 
    public String url; 
    @SerializedName("urlToImage") 
    public String urlToImage; 
    @SerializedName("publishedAt") 
    public String publishedAt; 
 
}

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 
 
    private List<Article> articleList = new ArrayList<>(); 
 
    public void setArticleList(List<Article> articleList) { 
        this.articleList = articleList; 
    } 
 
    static class ViewHolder extends RecyclerView.ViewHolder { 
        ImageView imageView; 
        TextView tvTitle, tvAuthor, tvDescription; 
 
        ViewHolder(View itemView) { 
            super(itemView); 
            imageView = itemView.findViewById(R.id.imageView); 
            tvDescription = itemView.findViewById(R.id.tvDescription); 
            tvTitle = itemView.findViewById(R.id.tvTitle); 
            tvAuthor = itemView.findViewById(R.id.tvAuthor); 
        } 
    } 
 
    @NonNull 
    @Override 
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false)); 
    } 
 
    @Override 
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) { 
        Article article = articleList.get(position); 
        holder.tvDescription.setText(article.description); 
        holder.tvAuthor.setText(article.author); 
        holder.tvTitle.setText(article.title); 
        GlideApp 
                .with(holder.itemView.getContext()) 
                .load(article.urlToImage) 
                .centerCrop() 
                .placeholder(R.drawable.ic_launcher_background) 
                .into(holder.imageView); 
    } 
 
    @Override 
    public int getItemCount() { 
        return articleList.size(); 
    } 
}

Answer 1

Пока формулировал вопрос , частично нашел ответ - в RecyclerViewAdapter я принимаю Api class Article , а нужно DbArticle , т.к. я уже сделал insert.

Но Timber в doOnNext все равно не выводит лог.

READ ALSO
Проблемы с фокусом при нажатии на Enter в EditText

Проблемы с фокусом при нажатии на Enter в EditText

Когда тыкаю на Enter в EditText, выбирается "следующим" неправильное поле(

213
Как проверять, когда был изменен файл, перед его загрузкой с сервера?

Как проверять, когда был изменен файл, перед его загрузкой с сервера?

Загружаю в стартовой активности файл с сервера(~400КБ) Файл формата

190
JavaFX event на перенос файла в программу

JavaFX event на перенос файла в программу

Есть готовая кнопка, по которой открывается файловая система и выбирается файлСейчас хочу сделать чтобы можно было перенести с проводника...

223