如何解决Android的13个最常见的错误消息(三)

9.应用程序无响应错误

这是一个错误,显示为您用于测试应用的Android设备或AVD上的对话框。在未响应的应用时,你的应用程序的UI冻结,仍然没有反应,为五秒钟以上用户输入时(ANR)错误。这通常是因为您的应用尝试在Android的主UI线程上执行冗长或密集的操作。

在Android中,主UI线程负责将所有用户输入事件分派到适当的UI小部件,以及更新应用程序的UI。但是,此线程一次只能处理一个任务,因此如果您使用任何长时间运行或密集型操作阻止主线程,那么在此任务完成之前,您的UI将完全无响应。

如果您在测试应用程序时遇到ANR消息,那么您肯定需要查看您在主线程上执行的工作。但是,如果你没有明确地遇到这个错误,但是注意你的应用程序有时感觉迟钝或迟滞,那么这表明你正处于ANR错误的边缘,你应该再次看看状态您的UI线程。

要解决ANR错误(以及接近 -ANR错误),您需要识别所有可能运行缓慢或需要大量处理能力的操作,然后将它们移出主线程。您可以通过创建工作线程来执行此操作,其中可以执行这些操作,而不会阻止主UI线程。

有几种创建其他线程的方法,但最简单的解决方案是使用一个AsynTask,因为这个类已经包含了自己的工作线程一个onPostExecute()可以用来与Android的主UI线程进行通信的回调。

但是,AsyncTasks更适合执行短后台操作,因此如果您需要执行长时间运行操作,那么您应该使用ServiceIntentService替代。

虽然从主线程中移除长时间运行和密集型任务将对应用程序的性能产生最大影响,但最佳做法是在主UI线程上尽可能少地执行工作。即使在主线程上运行少量不必要的代码也会对您的应用程序的响应性产生影响,因此一旦您成功重新定位了所有长时间运行和密集型操作,您应该查看是否还有更多代码可以使用离开主线程。

10.只有创建视图层次结构的原始线程才能触及其视图

在Android中,您只能从主线程更新UI。如果您尝试从任何其他线程访问UI元素,那么您将遇到此错误。

要解决此问题,请确定后台任务尝试更新UI并将其移至部分runOnUiThread,例如:

1

2

3

4

6

7

8

9

runOnUiThread(new Runnable() {

         @Override

          public void run() {

 

//Update your UI//

 

      }

 

});

或者,您可以使用处理程序或在AsyncTask中执行后台工作,因为您可以使用AsyncTask的onPostExecute()回调方法与主线程进行通信。最后,如果你发现自己经常在线程之间切换,那么你可能想要查看RxAndroid,因为这个库允许你创建一个新线程,安排在这个线程上执行的工作,然后将结果发布到主线程,所有只需几行代码。

  •  

11. NetworkOnMainThreadException

当您的应用尝试在主线程上执行网络操作(例如发送API请求,连接到远程数据库或下载文件)时,将引发此异常。由于网络操作可能非常耗时且耗费人力,因此它们很可能会阻塞主线程,因此每当您尝试在主线程上发出网络请求时,Android 3.0(Honeycomb)及更高版本都会抛出此错误。

如果遇到 NetworkOnMainThreadException,则找到主线程上运行的网络代码,并将其移至单独的线程。

如果您确实需要经常进行网络请求,那么您可能需要查看Volley,这是一个启动其自己的后台线程的HTTP库,以便默认情况下所有网络请求都在主线程上执行。

12.活动已经泄漏了最初在这里添加的窗口

退出活动后尝试显示对话时会发生此错误。如果您确实遇到此问题,请打开您的活动并确保通过调用dismiss()您的Activity onDestroy()onPause()方法正确地解除对话,例如:

1

2

3

4

6

7

8

@Override

protected void onDestroy()

{

       super.onDestroy();

        if(pDialogue!= null)

            pDialogue.dismiss();  

             

}

13. OutofMemoryError

当您的应用程序发出系统无法满足的内存请求时,会发生此错误。如果您遇到此错误消息,请首先排除所有最常见的内存管理错误。检查您是否记得取消注册所有广播接收器并且您已停止所有服务; 确保您没有保留任何静态成员变量中的引用,并且您没有尝试加载任何大型位图。

如果你已经排除了a的所有明显原因OutOfMemoryError,那么你需要深入挖掘并仔细检查你的应用程序如何分配内存,因为在某些方面你可以改进应用程序的内存管理。

Android Studio有一个专门用于帮助您分析应用内存使用情况的区域,因此首先从Android Studio工具栏中选择“ 视图”>“工具窗口 ”。此时,您将看到Android MonitorAndroid Profiler选项,具体取决于您安装的Android Studio版本。

我们之前讨论过在这个网站上使用Memory Monitor,但是由于Android Profiler是Android Studio的新增功能,让我们快速浏览一下它的主要功能。

当您打开Android Profiler时,它会自动开始记录三条信息。

Android Profiler会自动跟踪应用程序的CPU内存和网络信息

由于我们对应用程序使用内存的方式感兴趣,因此请单击“ 内存”部分,这将启动Memory Profiler

Memory Profiler包含一个时间轴,显示当前由应用程序分配的不同类型的内存,例如Java本机堆栈。在此图表上方,您可以找到一行图标,可用于触发不同的操作:

  • 强制垃圾收集事件。
  • 获取应用程序内存的Hprof快照。这是应用程序堆中所有对象的快照,包括应用程序分配的对象类型,已分配对象的数量以及这些对象占用的空间大小。
  • 记录内存分配。通过在执行某些操作时记录应用程序的内存分配,您可以识别消耗过多内存的特定操作。

Memory Profiler显示应用程序分配的不同类型的内存

要确定应用程序中负责该部分的部分,请OutOfMemoryError花一些时间与您的应用程序进行交互,并监控应用程序的内存分配如何随着不同的操作而发生变化。一旦你确定了导致问​​题的项目部分,花一些时间仔细检查它是否有任何内存泄漏,以及它使用内存的方式效率低下。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值