Android崩溃vc 程序 异常崩溃没有根点问题,怎么解决

Android的Crash崩溃解决方案-Bugly的使用
我们在开发过程中,经常会遇到程序闪退,但是Eclipse的Consle和Logcat又没有错误提示,或者是只有用的时间长了才会出现的偶然崩溃,这种就很难修复bug,也严重影响用户体验,用户分分钟卸载。腾讯的Bugly可以在app出现崩溃的时候上传错误信息,定位错误原因和语句,并且可以查看影响的用户数和程序Crash次数等等信息
下面说一哈Eclipse+时Bugly的配置和使用
一,下载SDK
下载Bugly库文件
首先去腾讯的Bugly网站下载Bugly库文件
1.下载Bugly的Android SDK包;
2.如果您的工程有Native代码(C/C++)或者集成了其他第三方SO库,建议下载Bugly的NDK动态库。
Bugly NDK包含多个架构的SO库:
armeabi-v7a
在集成Bugly SO库时,请注意只保留支持的架构SO库。
Eclipse 工程
1.将Bugly库文件复制到工程的libs目录下,SDK包和NDK都要复制到libs下;
2.Refresh一下工程;
3.添加工程依赖:鼠标右键点击Bugly的JAR文件,添加到编译路径中
二,配置参数
在AndroidManifest.xml中添加权限:
三,注册产品
在自己qq账户里边点击&我的App&
重要的是等到这个产品的&AppID&,这个ID需要写入到Manifest.xml的Application中的
四,最简单的初始化Application
获取APP ID并将以下代码复制到项目Application类onCreate()中,Bugly会为自动检测环境并完成配置:
CrashReport.initCrashReport(getApplicationContext(), &注册时申请的APPID&, false);
第三个参数在测试阶段最好设置为true
这里需要自定义一个Application
package com.hust.
import com.tencent.bugly.crashreport.CrashR
import android.app.A
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
CrashReport.initCrashReport(getApplicationContext(), &&, true);
现在您可以制造一个Crash,来体验Bugly的能力了。在初始化Bugly的之后,调用Bugly测 Crash接口。
在代码的任何位置添加如下语句就可以自己人工制造一个Crash:
CrashReport.testJavaCrash();
程序运行到这一句就Crash了,这是去看刚刚的Bugly网站就会有信息
然后去掉CrashReport.testJavaCrash();这个代码,运行带有Crash问题的程序,只要app发生崩溃,就会上传Crash信息,在我的Bugly网站上就会有错误信息Android处理应用崩溃异常并重启应用
Android处理应用崩溃异常并重启应用
实现的功能:
在程序出现异常导致崩溃时,能够拦截异常,将崩溃日志保存在本地或者上传至服务器保存,同时可以重启应用。
直接上代码:
继承Application的类CatchExcep:package com.
import java.util.ArrayL
import android.app.A
import android.app.A
public class CatchExcep extends Application{
ArrayList&Activity& list = new ArrayList&Activity&();
public void onCreate() {
super.onCreate();
public void init(){
//设置该CrashHandler为程序的默认处理器
UnCeHandler catchExcep = new UnCeHandler(this);
Thread.setDefaultUncaughtExceptionHandler(catchExcep);
* Activity关闭时,删除Activity列表中的Activity对象*/
public void removeActivity(Activity a){
list.remove(a);
* 向Activity列表中添加Activity对象*/
public void addActivity(Activity a){
list.add(a);
* 关闭Activity列表中的所有Activity*/
public void finishActivity(){
for (Activity activity : list) {
if (null != activity) {
activity.finish();
//杀死该应用进程
android.os.Process.killProcess(android.os.Process.myPid());
实现UncaughtExceptionHandler接口的类:UnCeHandler
package com.
import java.lang.Thread.UncaughtExceptionH
import android.app.AlarmM
import android.app.PendingI
import android.content.C
import android.content.I
import android.os.L
import android.util.L
import android.widget.T
import com.jingchen.timerpicker.MyTestA
public class UnCeHandler implements UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler mDefaultH
public static final String TAG = "CatchExcep";
public UnCeHandler(CatchExcep application){
//获取系统默认的UncaughtException处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
this.application =
public void uncaughtException(Thread thread, Throwable ex) {
if(!handleException(ex) && mDefaultHandler != null){
System.out.println("!handleException(ex) && mDefaultHandler != null");
//如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
Thread.sleep(2000);
}catch (InterruptedException e){
Log.e(TAG, "error : ", e);
Intent intent = new Intent(application.getApplicationContext(), MyTestActivity.class);
PendingIntent restartIntent = PendingIntent.getActivity(
application.getApplicationContext(), 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
//退出程序
AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
restartIntent); //1秒钟后重启应用
application.finishActivity();
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
* @param ex
* @return true:如果处理了该异常信息;否则返回false.
private boolean handleException(Throwable ex) {
if (ex == null) {
//使用Toast来显示异常信息
new Thread(){
public void run() {
Looper.prepare();
Toast.makeText(application.getApplicationContext(), "很抱歉,程序出现异常,即将退出.",
Toast.LENGTH_SHORT).show();
Looper.loop();
}.start();
com.jingchen.timerpicker.MyTestActivity:
package com.jingchen.
import android.app.A
import android.os.B
import android.view.V
import com.example.mywebview.R;
public class MyTestActivity extends Activity {
private String s =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
public void click(View v){
System.out.println(s);
AndroidManifest.xml:
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mywebview"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="8"
android:targetSdkVersion="19" /&
&uses-permission android:name="android.permission.INTERNET" /&
&uses-permission android:name="android.permission.RECEIVE_SMS" &
&/uses-permission&
&uses-permission android:name="android.permission.READ_SMS" /&
&uses-permission android:name="android.permission.READ_CONTACTS"/&
&uses-permission android:name="android.permission.WRITE_CONTACTS"/&
&application
android:name="com.mytest.CatchExcep"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:persistent="true"
android:theme="@style/AppTheme" &
android:name="com.jingchen.timerpicker.MyTestActivity"
android:label="@string/app_name" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&/application&
&/manifest&
没有更多推荐了,关于android ui界面嵌套层级过深,系统层级绘制报错崩溃如何解决
[问题点数:60分,结帖人u]
本版专家分:185
CSDN今日推荐
本版专家分:1929
本版专家分:4190
本版专家分:185
本版专家分:185
本版专家分:891
本版专家分:160
本版专家分:185
本版专家分:891
本版专家分:185
匿名用户不能发表回复!|
CSDN今日推荐代码复用前,首先得能用;
优雅的处理Android崩溃(一)
优雅的处理Android崩溃(一)
写在前面:
Android崩溃是我们开发中不可避免的异常处理,通常崩溃都会触发系统的强制关闭对话框,用户点击后系统会强制关闭当前进程,用户体验及其不好。本文就简单介绍下怎么优雅的处理全局异常并实现简单的日志保存,日志上送,以及程序重启。
大神请无视。。
你好,你们程序崩溃了,纳尼?
鬼知道发声了什么…
如果你的项目没有全局异常处理,没有实现日志保存和上送那么恭喜你,你中奖了。
接下来等待你的就是无休止的加班找bug,尽快找到还好,如果找不到问题。领导就要考虑换你了。
1. 什么是UncaughtExceptionHandler
UncaughtExceptionHandler是什么鬼?
Interface for handlers invoked when a Thread abruptly terminates due to an uncaught exception.When a thread is about to terminate due to an uncaught exception the Java Virtual Machine will query the thread
for its UncaughtExceptionHandler using Thread.getUncaughtExceptionHandler() and will invoke the handler’s uncaughtException method, passing the thread and the exception as arguments. If a thread has not had its UncaughtExceptionHandler explicitly set, then its ThreadGroup object acts as its UncaughtExceptionHandler. If the ThreadGroup object has no special requirements for dealing with the exception, it can forward the invocation to the default uncaught exception handler.
大概意思是说:如果一个程序没有捕获异常,java虚拟机调用Thread.getUncaughtExceptionHandler()处理,如果一个线程没有uncaughtexceptionhandler设置,那么它的线程组对象作为其uncaughtexceptionhandler。如果线程组对象具有处理异常的能力,可以在线程组内处理异常,如果没有处理能力也可以转发给默认的捕获异常处理程序。。
2. UncaughtExceptionHandler怎么用?
UncaughtExceptionHandler是一个接口,需要创建类来实现这个接口。
(1)创建UniException类并实现UncaughtExceptionHandler接口。
(2)重写uncaughtException()方法,当UncaughtException发生时会转入该函数来处理。
(3)单例模式创建静态getInstance()方法,获取当前UniException类对象。
(4)创建init()方法,获取系统默认的UncaughtException处理器,设置本类为程序的默认处理器。
(5)创建handleException()方法,自定义错误处理,收集错误日志,上送错误日志。
具体实现如下:
public class UniException implements UncaughtExceptionHandler {
public static final String TAG = "UniException";
private Thread.UncaughtExceptionHandler mDefaultH
private static UniException INSTANCE = new UniException();
private Map&String, String& infos = new HashMap&String, String&();
/** 保证只有一个实例 */
private UniException() {
/** 获取UniException实例 ,单例模式 */
public static UniException getInstance() {
if (INSTANCE == null) {
INSTANCE = new UniException();
INSTANCE.init();
return INSTANCE;
public void init() {
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
* 当UncaughtException发生时会转入该函数来处理
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
Thread.sleep(3000);
} catch (InterruptedException e) {
LogUtil.e("error : " + e.getMessage());
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
* true:如果处理了该异常信息;否则返回false.
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
new Thread() {
public void run() {
Looper.prepare();
Toast.makeText(AppOS.appOS, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show();
Looper.loop();
}.start();
collectDeviceInfo(AppOS.appOS);
File file = new File(INI.INI_BUS_LOG_FLODER);
if (!file.exists()) {
file.mkdirs();
FileOutputS
fout = new FileOutputStream(new File(INI.INI_BUS_LOG_FLODER + DateUtil.getYourTime("yyyyMMdd") + ".log"),
fout.write(("&&&&时间:" + DateUtil.getYourTime(DateUtil.yyyyMMdd_HH_mm_ss) + "\r\n").getBytes("utf-8"));
fout.write(("信息:" + ex.getMessage() + "\r\n").getBytes("utf-8"));
for (int i = 0; i & ex.getStackTrace(). i++) {
fout.write(("****StackTrace" + i + "\r\n").getBytes("utf-8"));
fout.write(("行数:" + ex.getStackTrace()[i].getLineNumber() + "\r\n").getBytes("utf-8"));
fout.write(("类名:" + ex.getStackTrace()[i].getClassName() + "\r\n").getBytes("utf-8"));
fout.write(("文件:" + ex.getStackTrace()[i].getFileName() + "\r\n").getBytes("utf-8"));
fout.write(("方法:" + ex.getStackTrace()[i].getMethodName() + "\r\n\r\n").getBytes("utf-8"));
fout.write(
"--------------------------------\r\n--------------------------------\r\n--------------------------------\r\n"
.getBytes("utf-8"));
fout.close();
} catch (Exception e) {
e.printStackTrace();
return true;
* 收集设备参数信息
public void collectDeviceInfo(Context ctx) {
PackageManager pm = ctx.getPackageManager();
PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);
if (pi != null) {
String versionName = pi.versionName == null ? "null" : pi.versionN
String versionCode = pi.versionCode + "";
infos.put("versionName", versionName);
infos.put("versionCode", versionCode);
} catch (NameNotFoundException e) {
LogUtil.e("an error occured when collect package info" + e.getMessage());
Field[] fields = Build.class.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
infos.put(field.getName(), field.get(null).toString());
LogUtil.e(field.getName() + " : " + field.get(null));
} catch (Exception e) {
LogUtil.e("an error occured when collect crash info" + e.getMessage());
3.定义完成后续咋用?
(1) 定义类AppOS extends Application
(2)在AndroidManifest.xml中注册AppOS
(3)注册异常处理UniException.getInstance().init(getApplicationContext());
public class AppOS extends Application {
public static AppOS appOS;
public void onCreate() {
super.onCreate();
appOS = this;
UniException.getInstance().init(getApplicationContext());
没有更多推荐了,Android 开发如何处理网络异常?
[问题点数:60分,结帖人anybyb]
本版专家分:0
结帖率 99.29%
CSDN今日推荐
本版专家分:8081
2013年5月 移动平台大版内专家分月排行榜第一2013年4月 移动平台大版内专家分月排行榜第一
2012年12月 移动平台大版内专家分月排行榜第三
本版专家分:0
结帖率 99.29%
本版专家分:11554
2014年3月 移动开发大版内专家分月排行榜第二
本版专家分:78
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐}

我要回帖

更多关于 异常问题处理流程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信