Android开发-新建线程崩溃
一直不满意车机不能实现屏保,最近发现可以通过设置亮度实现,顾萌生了自己写程序的来实现的念头,遂修改原来练手的app。毕竟过去了1年,各类程序、sdk都已经更新了不知道多少版本。经历了痛苦的升级、更新,终于没能在原有的代码上直接升级,还是新建一个工程,复制原来的代码来生成app。
原来可以跑的app,竟然崩溃,而且还不能截获异常。通过debug,发现崩溃跟新建了一个线程有关,网上度了一下,发现还是能够捕获此类异常,原文:Android UncaughtExceptionHandler捕获线程崩溃异常。
我原来的代码仅一句:new downloadApkThread().start();
修改为:
- Thread thread = new downloadApkThread();
- thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
- @Override
- public void uncaughtException(Thread thread, Throwable ex) {
- //TODO
- System.out.println(ex.getLocalizedMessage());
- }
- });
- thread.start();
在行6处断点,发现线程崩溃的原因是:“Can't create handler inside thread that has not called Looper.prepare()”。继续在网上度,解释非常多,原因没仔细看,大概跟主从线程之间的消息分发有关,发扬一贯的囫囵吞枣精神,找了个能解决问题的最简单方案用了:Android开发报错 Can not create handler inside thread t
我的从线程代码中出现使用了Toast之类的方法:“Toast.makeText(mContext, mContext.getResources().getString(R.string.soft_update_fail_downloadapk), Toast.LENGTH_LONG).show();”之类的代码时,就在前面加Looper.prepare();,后面加Looper.loop();。当然,还要记得import android.os.*;
解决了两个问题,线程崩溃的异常截获,据原文描述,可以在主activity的OnCreate方法中添加下面代码,就可以截获所有线程发生时的异常,听起来挺美好,不过我没试,以后有需要再说吧。
- Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
- public void uncaughtException(Thread thread, Throwable ex) {
- //任意一个线程异常后统一的处理
- System.out.println(ex.getLocalizedMessage());
- finish();
- }
- });
至于第二个问题,不知道为何原来的代码没问题,现在就出现问题,也许是android studio和SDK升级了所致?反正没时间深究。
Android开发-新建线程崩溃的更多相关文章
- Android开发之线程池使用总结
线程池算是Android开发中非常常用的一个东西了,只要涉及到线程的地方,大多数情况下都会涉及到线程池.Android开发中线程池的使用和Java中线程池的使用基本一致.那么今天我想来总结一下Andr ...
- Android 开发 ThreadPool(线程池) 总结
本文是介绍线程池的基础篇. 一.线程池的作用 创建异步线程的弊端: 1.每次new Thread创建对象,导致性能变差. 2.缺乏统一的管理,可能导致无限制的线程运行,严重的后果就是OOM 或者死机. ...
- Android开发之处理崩溃异常
众所周知,android的设备千差万别,难免会发生崩溃异常等现象,这个时候就需要捕获哪些崩溃异常了,也就是捕获崩溃异常的相关信息,并记录下来,这样一来方便开发人员和测试人员的分析与调试. 1.首先我们 ...
- android开发之线程
线程(android) 在java中我们学习了线程,线程,是进程的一个单位,在程序要运行时,会开启线程,运行程序,我们要创建线程就需要我们去继承接口Thread或者实现Runabl ...
- Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”
为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API, ...
- Android开发——子线程操作UI的几种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...
- Android开发——子线程操作UI的几种方法(待续)
方法2 Handler andler mHandler = new Handler() { @Override public void handleMessage(Message msg) { su ...
- android开发入门经验 ADT Bundle环境搭建
现在有许多做开发的转做移动端开发,做J2EE的转做Android开发,我也把自己的一些入门经验与大家分享一下,希望能给你带来帮助. 工具/原料 JDK,ADT,JAVA 方法/步骤 开发工具的准备 ...
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
接上篇<android开发艺术探索>读书笔记(十)--Android的消息机制 No1: 在Android中可以扮演线程角色的有很多,比如AsyncTask.IntentService.H ...
随机推荐
- 《Java Concurrency》读书笔记,构建线程安全应用程序
1. 什么是线程安全性 调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态.如果其他线程企图访问一 ...
- Android Gradle 引入 aar 方式
方式 1 File -> New -> New Module -> Import .JAR/.AAR Package Choose File Finish 在 build.gradl ...
- mybatis自己学习的一些总结
曾经一直在使用spring的JDBCTEMPLATE和hibernate做项目.两个都还不错,spring的jdbctemplate用起来比較麻烦,尽管非常easy.而hibernate呢,用起来非常 ...
- Invalid configuation file. File "**********" was created by a VMware product with more feature than this version of VMware Workstation and cannot be
大概就是说你的之前用来创建虚拟机的VM版本太高,被移植的VM版本太低.所以你需要改一点东西. 打开你的虚拟机的目录(不是VM的),然后看到你很多文件. 然后你看到*.vmx的文件(实在找不到就按文件类 ...
- javascript 关于局部变量和全局变量
js中函数运行过程不仅仅是单纯的局部变量覆盖全局变量.和函数里面的声明情况有关. 比方: <script> var a =1; function test(){ alert(a); //a ...
- hdu 2680 Choose the best route (dijkstra算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...
- Docker 入门 --- 命令总结
Docker命令总结 前言 命令来自于官网的get-started教程,放在这里自用 part-1 ## List Docker CLI commands docker docker containe ...
- Java使用HttpClient实现Post请求
http://www.cnblogs.com/mengrennwpu/p/6418114.html ******************************************* 基于项目需求 ...
- Django服务端读取excel文件并且传输到接口
path_name = "opboss_download_" + str(int(time.time())) + ".csv" print(path_name) ...
- Logstash写入MongoDB数据库
1. 列出logstash-plugins bin/logstash-plugin list****** logstash-output-kafkalogstash-output-nagioslogs ...