Попытка доступа к объекту Realm из интерфейса

Я использую Realm, и я создал интерфейс для анализа RealmObject в моем адаптере, который будет реализован в действии, но я получаю эту ошибку

**Object is no longer valid to operate on. Was it deleted by another thread?**

Это мой код ниже.

NewsAdapter.java

public class TestNewsAdapter extends RealmBaseRecyclerViewAdapter<NewsTrend, TestNewsAdapter.PostsViewHolder> {

public RealmResults<NewsTrend> realmResults;
public Context context;
public EventListener eventListener;
static  String fbid;
private User user;

boolean isFav;



public TestNewsAdapter(Context context, RealmResults<NewsTrend> realmResults,
                       boolean automaticUpdate, User user) {
    super(context, realmResults, automaticUpdate);
    this.realmResults = realmResults;
    this.context = context;
    this.user = user;
}

public void setEventListener(EventListener eventListener) {
    this.eventListener = eventListener;
}

@Override
public PostsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    fbid = user.getId();
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_news, viewGroup, false);
    PostsViewHolder mediaViewHolder = new PostsViewHolder(v);
    return mediaViewHolder;
}

@Override
public void onBindViewHolder(final PostsViewHolder holder, final int position) {

    final NewsTrend postsData = getItem(position);

    holder.itemView.setTag(postsData);

    String eventName = postsData.getTitle();
    String eventDate = postsData.getTimestamp();
    holder.sourceName.setText(postsData.getType());
    Spanned decodedTitle = Html.fromHtml(eventName);

    holder.tvCountPageView.setText(postsData.getRead_count() + " Views");
    holder.tvNewsCountLike.setText(""+ postsData.getLike_count());

    holder.tvNewsTitle.setText(decodedTitle);
    holder.tvNewsDate.setText(getSplitDate(eventDate));
    String text = postsData.getContent() + "<font color='red'>  <strong>More...</strong></font>";
    holder.tvNewsShortText.setText(Html.fromHtml(text), TextView.BufferType.SPANNABLE);

    if (postsData.getType().equals("Bella Naija")) {
        holder.sourceImg.setImageResource(R.drawable.bella);
    } else if (postsData.getType().equals("Punch")) {
        holder.sourceImg.setImageResource(R.drawable.punch);
    } else if (postsData.getType().equals("Linda Ikeji")) {
        holder.sourceImg.setImageResource(R.drawable.lib);
    } else if (postsData.getType().equals("Pulse")) {
        holder.sourceImg.setImageResource(R.drawable.pulse_logo);
    }
    // holder.sourceName.setText(postsData.getType());

    Glide.with(context)
            .load(postsData.getImage())
            .centerCrop()
            .placeholder(R.drawable.tw_logo)
            .into(holder.ivNewsImage);



    if (postsData.getLike_status() == 1) {
        holder.ivLike.setImageResource(R.drawable.kalp_dolu_kucuk);
    } else {
        holder.ivLike.setImageResource(R.drawable.kalp_bos_kucuk);
    }


    if (postsData.getArch_status() == 1) {
        Log.d("logFavourite", String.valueOf(postsData.getLike_status()));
        holder.ivFavorite.setImageResource(R.drawable.yildiz_dolu_kucuk);
        this.isFav = true;
    } else {
        holder.ivFavorite.setImageResource(R.drawable.yildiz_bos_kucuk);
        this.isFav = false;
    }

    holder.llRight.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            eventListener.onItemClick(v, postsData);
        }
    });


    holder.ivShare.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String shareBody = postsData.getHref();

            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
            sharingIntent.setType("text/plain");
            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Trending App");
            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
            context.startActivity(Intent.createChooser(sharingIntent, "Paylaş"));
        }
    });

    holder.ivFavorite.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            eventListener.onFavClick(v,postsData,holder.ivFavorite, isFav);
        }
    });

    holder.ivLike.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            eventListener.onLikeClick(v, postsData, holder.tvNewsCountLike, holder.ivLike);
        }
    });

}




@Override
public NewsTrend getItem(int i) {
    return realmResults.get(i);
}

public void swapData(RealmResults<NewsTrend> realmResults) {
    this.realmResults = realmResults;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public int getItemCount() {
    return realmResults.size();
}

public static class PostsViewHolder extends RecyclerView.ViewHolder {

    public RobotoTextView tvNewsDate;
    public RobotoTextView tvNewsTitle;
    public RobotoTextView tvNewsShortText;
    public RobotoTextView sourceName;
    public ImageView sourceImg;

    RelativeLayout postContentHolder;



    public LinearLayout llLeft;
    public LinearLayout llRight;

    public ImageView ivArrowLeft;
    public ImageView ivArrowRight;

    public ImageView ivNewsImage;

    public ImageView ivShare;

    public ImageView ivFavorite;
    public ImageView ivLike;

    public TextView tvCountPageView;
    public TextView tvNewsCountLike;

    PostsViewHolder(View itemView) {
        super(itemView);
        postContentHolder = (RelativeLayout) itemView.findViewById(R.id.postContentHolder);
        ivNewsImage = (ImageView) itemView.findViewById(R.id.ivNewsImage);
        ivArrowLeft = (ImageView) itemView.findViewById(R.id.ivArrowLeft);
        ivArrowRight = (ImageView) itemView.findViewById(R.id.ivArrowRight);
        llLeft = (LinearLayout) itemView.findViewById(R.id.llLeft);
        llRight = (LinearLayout) itemView.findViewById(R.id.llRight);

        ivShare = (ImageView) itemView.findViewById(R.id.ivShare);
        sourceImg = (ImageView) itemView.findViewById(R.id.sourceImg);
        sourceName = (RobotoTextView) itemView.findViewById(R.id.sourceName);
        tvNewsTitle = (RobotoTextView) itemView.findViewById(R.id.tvNewsTitle);
        tvNewsShortText = (RobotoTextView) itemView.findViewById(R.id.tvNewsShortText);
        tvNewsDate = (RobotoTextView) itemView.findViewById(R.id.tvNewsDate);

        ivFavorite = (ImageView) itemView.findViewById(R.id.ivFavorite);
        ivLike = (ImageView) itemView.findViewById(R.id.ivLike);

        tvNewsCountLike = (TextView) itemView.findViewById(R.id.tvNewsCountLike);
        tvCountPageView = (TextView) itemView.findViewById(R.id.tvCountPageView);

    }
}

public interface EventListener {
    void onItemClick(final View view, NewsTrend postsData);

    void onLikeClick(final View view, NewsTrend postsDAta, TextView tvNewsCountLike,
                     ImageView ivLike);

    void onFavClick(final View view, NewsTrend postData, ImageView ivArchive, boolean isArchive);

}

@Override
public int getItemViewType(int position) {
    return position;
}

public String getSplitDate(String dateString){

     return dateString;
  }
}

Затем реализация в классе Fragment

@Override
public void onLikeClick(View view, NewsTrend postData, TextView tvNewsCountLike,
                        ImageView ivLike) {
    if (!postData.isChecked()) {
        realm.beginTransaction();
        postData.setChecked(true);
        realm.commitTransaction();
        tvNewsCountLike.setText("" + (Integer.parseInt(tvNewsCountLike.getText().toString()) + 1));
        ivLike.setImageResource(R.drawable.kalp_dolu_kucuk);
    } else {
        realm.beginTransaction();
        postData.setChecked(false);
        realm.commitTransaction();
        tvNewsCountLike.setText("" + (Integer.parseInt(tvNewsCountLike.getText().toString()) - 1));
        ivLike.setImageResource(R.drawable.kalp_bos_kucuk);
    }
    adapter.notifyDataSetChanged();
    like(postData.getNews_id());
}

postData в интерфейсе возвращается,

Объект больше не подходит для операций. Было ли оно удалено другим потоком?


person SimpuMind    schedule 29.08.2016    source источник
comment
Какая у вас версия реалма?   -  person EpicPandaForce    schedule 29.08.2016
comment
io.realm: область-андроид: 0.85.0   -  person SimpuMind    schedule 29.08.2016
comment
По какой причине вы никогда не обновлялись хотя бы до 0.87.5? Он не использует плагин Gradle (представленный в 0.88.0) и еще не имел кучу критических изменений, и он намного более стабилен.   -  person EpicPandaForce    schedule 29.08.2016
comment
Если я обновлю, он будет работать нормально   -  person SimpuMind    schedule 29.08.2016
comment
Где вы открываете/закрываете свой экземпляр Realm? Хотя это не решит вашу конкретную проблему, в версии 0.87.2 была исправлена ​​ошибка, из-за которой я слишком долго оставался на 0.82.2. Хотя последняя версия 1.2.0, не забывайте и об этом. Просто вы очень сильно столкнетесь с критическими изменениями 0.89.0.   -  person EpicPandaForce    schedule 29.08.2016
comment
Внутри фрагмента   -  person SimpuMind    schedule 29.08.2016
comment
Создавать и разрушать   -  person SimpuMind    schedule 29.08.2016
comment
Хотя я думаю, что это должно работать, вместо этого вы должны поместить их в onCreateView() и onDestroyView().   -  person EpicPandaForce    schedule 29.08.2016
comment
Хорошо, я бы сделал это сейчас, но как вы мне поможете, как вы думаете, я могу подойти к этой проблеме, чтобы решить ее, мне действительно нужно двигаться дальше   -  person SimpuMind    schedule 29.08.2016


Ответы (1)


Я смог решить проблему, обновив Realm с

io.realm:realm-android:0.85.0 

в текущую версию с помощью плагина Grade.

person SimpuMind    schedule 30.08.2016