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_list
是ArrayList,messages
是RecyclerView
我正在使用 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)有哪些,有什么区别?