Android 13 ANR处理问题

k5hmc34c  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(187)

我知道以下是违反所有Android最佳实践的...所以请对我好一点:-)
我们有一个很大的遗留软件,不容易转换。应用程序确实在UI线程上做了很多事情。因此,在某些情况下,Android有时会认为我们的应用处于死锁状态。所以它提示用户ANR(应用程序没有响应->等待,或关闭?)我们的用户知道我们的软件在某些部分上架构不好,所以点击“等待”...在Android 7到12上,ANR会自行清除。mainThread再次响应,因此应用程序可以正常工作。但在Android 13上,情况并非如此。mainThread再次响应,应用程序可以正常使用,但ANR消息每5秒返回一次。
在一个简单的Kotlin应用程序中,这可以用最小的努力来尝试。

  • 创建带有两个按钮和一个标签的Activity
  • 第一个按钮增加计数器并刷新标签
  • 第二个按钮有一个5秒的睡眠时间(让它12秒,所以你是100%的问题)

如果首先按下睡眠按钮,然后多次按下增加按钮,应用程序首先冻结,当睡眠时间结束时,标签会刷新我们按下的次数。5秒后,ANR消息传来...单击等待.... ANR又来了……一次又一次...
听起来像是Android 13中的一个问题。
有没有一种很好的方法来清除主线程的消息队列,这样Android就不会一遍又一遍地尝试传递消息?
谢谢你的帮助...

jtoj6r0c

jtoj6r0c1#

我认为你有一个非常糟糕的方法:-)
你不能把长任务交给UI来处理。在你的代码中,你可以简单地使用例如。android的Handler(UI,主线程)结合Runnable(后台线程),你将解决所有问题。此外,您可以根据需要从Runnable调用runOnUiThread(new Runnable),问题就解决了。
例如,您可以执行以下操作:

  1. // Call this from your button -> click
  2. private void doMyBigJob(){
  3. // Notify the user that their task has started
  4. // Set wait icon or similar method here, for example:
  5. imageView1.setImageResource(R.mipmap.wait1_3);
  6. // The user is now waiting for your code to execute...
  7. new Thread(new Runnable() {
  8. @Override
  9. public void run() {
  10. // Here, you can write code, e.g. for HTTP connections and similar background tasks
  11. // and here...
  12. // Now notify the user that half the work is done.
  13. runOnUiThread(new Runnable() {
  14. @Override
  15. public void run() {
  16. imageView1.setImageResource(R.mipmap.wait2_3);
  17. }
  18. });
  19. // Write the rest of the code here
  20. // and here...
  21. // Now notify the user that everything is done.
  22. runOnUiThread(new Runnable() {
  23. @Override
  24. public void run() {
  25. imageView1.setImageResource(R.mipmap.job_finished);
  26. // or imageView1.setVisibility(View.GONE);
  27. }
  28. });
  29. }
  30. }).start();
  31. }

希望我没有答错。

展开查看全部

相关问题