【问题标题】:Android emulator crash if click while processing如果在处理时单击,Android 模拟器会崩溃
【发布时间】:2012-01-10 23:51:36
【问题描述】:

我一直在开发一个 android 应用程序并在模拟器上对其进行测试。此应用程序的某些部分需要一些处理时间,例如登录,可能需要长达 10 秒。如果应用程序正在处理登录,并且我单击了模拟器屏幕上的任意位置,则会导致应用程序崩溃 -> 会弹出强制关闭/等待窗口,即使我选择等待,此登录过程也永远不会完成。

不知道有没有人遇到过这种情况?我能做些什么来避免用户在处理过程中点击并使程序崩溃?还是在真手机上没问题?

谢谢!

编辑:这确实是一个 UI 线程问题,我正在使用 Mono for Android 来编写这个应用程序,我使用 Here! 介绍的方法解决了我的问题

编辑: 这是 LOGCAT 消息

1-11 00:38:49.165 W/WindowManager(   59): Key dispatching timed out sending to BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1
01-11 00:38:49.165 W/WindowManager(   59): Previous dispatch state: {{KeyEvent{action=1 code=66 repeat=0 meta=0 scancode=28 mFlags=8} to Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false} @ 1326241690617 lw=Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false} lb=android.os.BinderProxy@4508a900 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false}}}
01-11 00:38:49.175 W/WindowManager(   59): Current dispatch state: {{null to Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false} @ 1326242329174 lw=Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false} lb=android.os.BinderProxy@4508a900 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{44ed87d0 BadumnaAndroidApi1.BadumnaAndroidApi1/badumnaandroidapi1.Activity1 paused=false}}}
01-11 00:38:49.276 I/Process (   59): Sending signal. PID: 316 SIG: 3
01-11 00:38:49.276 I/dalvikvm(  316): threadid=3: reacting to signal 3
01-11 00:38:49.485 I/dalvikvm(  316): Wrote stack traces to '/data/anr/traces.txt'
01-11 00:38:49.485 I/Process (   59): Sending signal. PID: 59 SIG: 3
01-11 00:38:49.485 I/dalvikvm(   59): threadid=3: reacting to signal 3
01-11 00:38:49.595 I/dalvikvm(   59): Wrote stack traces to '/data/anr/traces.txt'
01-11 00:38:49.616 I/Process (   59): Sending signal. PID: 114 SIG: 3
01-11 00:38:49.616 I/dalvikvm(  114): threadid=3: reacting to signal 3
01-11 00:38:49.625 I/dalvikvm(  114): Wrote stack traces to '/data/anr/traces.txt'
01-11 00:38:49.636 I/Process (   59): Sending signal. PID: 107 SIG: 3
01-11 00:38:49.645 I/dalvikvm(  107): threadid=3: reacting to signal 3
01-11 00:38:49.655 I/dalvikvm(  107): Wrote stack traces to '/data/anr/traces.txt'
01-11 00:38:49.673 I/Process (   59): Sending signal. PID: 254 SIG: 3
01-11 00:38:49.865 I/dalvikvm(  254): threadid=3: reacting to signal 3
01-11 00:38:49.875 I/Process (   59): Sending signal. PID: 246 SIG: 3
01-11 00:38:49.906 I/dalvikvm(  246): threadid=3: reacting to signal 3
01-11 00:38:50.085 I/Process (   59): Sending signal. PID: 177 SIG: 3
01-11 00:38:50.115 I/dalvikvm(  177): threadid=3: reacting to signal 3
01-11 00:38:50.285 I/Process (   59): Sending signal. PID: 221 SIG: 3
01-11 00:38:50.345 I/dalvikvm(  221): threadid=3: reacting to signal 3
01-11 00:38:50.495 I/Process (   59): Sending signal. PID: 169 SIG: 3
01-11 00:38:50.575 I/dalvikvm(  169): threadid=3: reacting to signal 3
01-11 00:38:50.695 I/Process (   59): Sending signal. PID: 185 SIG: 3
01-11 00:38:50.735 I/dalvikvm(  185): threadid=3: reacting to signal 3
01-11 00:38:50.905 I/Process (   59): Sending signal. PID: 111 SIG: 3
01-11 00:38:50.905 I/dalvikvm(  111): threadid=3: reacting to signal 3
01-11 00:38:51.065 I/dalvikvm(  111): Wrote stack traces to '/data/anr/traces.txt'
01-11 00:38:51.065 I/Process (   59): Sending signal. PID: 205 SIG: 3
01-11 00:38:51.185 I/dalvikvm(  205): threadid=3: reacting to signal 3
01-11 00:38:51.275 I/Process (   59): Sending signal. PID: 194 SIG: 3
01-11 00:38:51.405 I/dalvikvm(  194): threadid=3: reacting to signal 3
01-11 00:38:51.485 I/Process (   59): Sending signal. PID: 155 SIG: 3
01-11 00:38:51.605 I/dalvikvm(  155): threadid=3: reacting to signal 3
01-11 00:38:51.685 I/Process (   59): Sending signal. PID: 149 SIG: 3
01-11 00:38:51.875 I/dalvikvm(  149): threadid=3: reacting to signal 3
01-11 00:38:51.885 I/Process (   59): Sending signal. PID: 115 SIG: 3
01-11 00:38:51.916 I/dalvikvm(  115): threadid=3: reacting to signal 3

【问题讨论】:

  • LogCat 上是否有任何关于此类崩溃可能原因的信息?
  • 你确定这是崩溃吗?也许您只是在 UI 线程中进行处理,而您的应用程序挂起(因此,出现强制关闭选项的窗口)。
  • 感谢@user1234567,我是android新手,所以你的意思是我不能在UI线程中进行处理,否则会发生这种情况?
  • @harism LogCat 信息已更新。它看起来确实像 user1234567 所描述的线程问题。我将更改处理线程,看看它是如何进行的

标签: android android-asynctask emulation xamarin.android


【解决方案1】:

好吧,您有可能可能由于这种繁重的处理而导致 UI 线程挂起 - 但我可能会在没有看到任何代码的情况下 - 提示 -。您可能将繁重的东西放入与您当前正在运行的 GUI 线程分开的后台线程中。

幸运的是,Android 有 AsyncTask 类可以帮助您。可以说(因为问题中没有足够的细节)您正在通过向服务器发出 Web 请求来登录您的应用程序。当用户按下登录时,您希望在后台线程中执行所有跑腿工作时显示某种处理消息。

看看这篇文章,尤其是 AsyncTask 示例http://www.vogella.de/articles/AndroidPerformance/article.html

您可以看到 doInBackground() 是完成所有繁重工作的地方,而 postExecute() 再次在 UI 线程中运行,这是您希望根据刚刚发生的结果更新 UI 的地方。例如用户登录成功或登录时出错。

我可以继续使用相当长的一段时间,但是这是有据可查的。谷歌自己的另一个好帖子可以在这里找到http://android-developers.blogspot.com/2009/05/painless-threading.html

【讨论】:

  • 谢谢你,我认为你的观点很好,因为我正在做一些繁重的处理,我正在将一个 windows .NET 应用程序转换为 android,曾经有一个 BackgroundWorker 用于在后台处理这个,所以我认为这可能是问题所在。感谢您提供所有信息!我试试看!
  • 谢谢,这是一个很好的答案,这正是我的问题所在。但是,我使用 Mono for Android 来编写应用程序(因为我从未提到过,所以你不可能知道),在我的情况下使用 AsyncTask 可能有点复杂。我已经使用Click Here 中介绍的方法解决了我的问题,仅适用于那些也使用单声道并遇到同样问题的人。非常感谢!!干杯!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多