Activity 没有响应并且 RecyclerView 没有反映变化

Posted

技术标签:

【中文标题】Activity 没有响应并且 RecyclerView 没有反映变化【英文标题】:Activity does not respond and RecyclerView not reflecting changes 【发布时间】:2020-11-20 09:23:46 【问题描述】:

我正在制作一个 android 短信应用。 我使用了 RecyclerView 来显示所有消息。

SmsAdapter.java

public class SmsAdapter extends RecyclerView.Adapter<SmsAdapter.SmsViewHolder>
    private static final String TAG = " [MY_DEBUG] ";

    ArrayList<String> sms_messages_list;
    Context context;

    public  SmsAdapter(Context ct, ArrayList<String> array_list)
        context = ct;
        sms_messages_list = array_list;
    

    public void insert(int position, String new_sms) 
        Log.d(TAG, "SmsAdapter: insert(): adding a new message at position + " + position);
        sms_messages_list.add(position, new_sms);
        notifyDataSetChanged();
    

//more code here, might add if you guys ask so.

创建了 SmsAdapter 对象并使用 MainActivity.java 中索引 0 处的项目对其进行初始化:

        sms_messages_list.add(0, "dummy");
        sms_adapter = new SmsAdapter(this, sms_messages_list);
        messages.setAdapter(sms_adapter);
        messages.setLayoutManager(new LinearLayoutManager(this));

其中sms_messages_listArrayListmessagesRecyclerView

我正在使用 AsyncTask 在后台线程中读取数据库(在 doInBackground() 中),然后将项目添加到 onPostExecute() 内的 SmsAdapter

onPostExecute()

@Override
        protected void onPostExecute(ArrayList<String> msg_list) 
            super.onPostExecute(msg_list);
            MainActivity activity = activityWeakReference.get();
            if (activity == null || activity.isFinishing()) 
                return;
            
            int j=0;
            try 
                    while (j < msg_list.size()) 
                    activity.sms_adapter.insert(j, msg_list.get(j).toString());
                    j++;
                    
            
            catch (Exception e)
                Log.d(TAG, "onPostExecute: exception : " + e);
                        
       db1.startTransaction();    // this line I did not put in original question and this is what caused the porblem  ... replaced it with db1.endTransaction() and code works 
       db1.close();
       

msg_list 是一个 ArrayList,其中包含字符串格式的所有 SMS 消息(一个字符串项 = 一个 SMS)

////

EDIT 1:这是整个 AsyncTask 代码: https://pastebin.com/q495VjMs

////

当我运行它时,我只看到一个项目是“dummy”,并且活动甚至没有响应。数据库已正确读取,msg_list 包含预期的所有消息。我无法找到我在哪里出错了。请帮忙!

应用没有响应

RecyclerView 中没有显示其他项目

logcat中唯一的错误:

2020-07-30 20:09:56.344 578-599/system_process E/ActivityManager: ANR in com.example.mynewsmsapp_kotlin (com.example.mynewsmsapp_kotlin/.MainActivity)
    PID: 2455
    Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 2.  Wait queue head age: 7166.5ms.)
 

PS:对不起,我的应用程序的名字很奇怪。我知道这没有意义。

【问题讨论】:

不要使用 assynctask,它已被弃用。使用 Rx 或协程。我的猜测是,访问数据库是在主线程上完成的,并且需要很长时间,这就是“不响应”错误的原因。 你能把你的整个asyncTask贴出来吗? @Rinat 我已经在 doInBackground() 中完成了数据库操作,所以我猜这发生在后台线程中。 @BlackHatSamurai 是的,这里是链接pastebin.com/q495VjMs。对不起,我的代码太乱了。但我认为任何其他部分都没有问题,因为日志正确显示了messages_list的内容。除了适配器,一切看起来都很好。如果你有时间,请看看我哪里出错了。 【参考方案1】:

请把这段代码改成这样:

      public  SmsAdapter(Context ct, ArrayList<String> array_list)
               this.context = ct;
               this.sms_messages_list.addAll(array_list);
        
        //////////////////////////////////////////////////////////////////////////////
        int j=0;
        try 
                while (j < msg_list.size()) 
                activity.sms_adapter.insert(msg_list.get(j).toString());
                j++;
                
        
        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        public void insert(String new_sms) 
            sms_messages_list.add(new_sms);
            notifyDataSetChanged();
        

【讨论】:

感谢您抽出宝贵时间。不幸的是,这不起作用:(【参考方案2】:

之前我错误地将db.startTransaction() 而不是db.endTransaction() 放在方法onPostExecute() 的末尾。现在我做到了db.endTrasaction() 并且代码有效。

【讨论】:

以上是关于Activity 没有响应并且 RecyclerView 没有反映变化的主要内容,如果未能解决你的问题,请参考以下文章

响应Activity中的ViewPager2 Fragments事件

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

Activity 5秒 Broadcast 10秒 Service 20秒

在Activity中响应ListView内部按钮的点击事件

Android导航抽屉项目没有响应

安卓入门 使用android创建一个项目 从启动activity中响应按钮事件 启动另一个activity 并传递参数