当前位置:首页 » 安卓系统 » android捕捉异常

android捕捉异常

发布时间: 2022-12-22 20:53:44

1. Android性能优化之ANR异常监测

 ANR是Application Not Responding的缩写,即应用程序无响应。简单来说,就是应用的界面突然卡住了,无法响应用户的操作如触摸事件等。

 解决ANR问题,首先要做的是找到问题,线下我们可以通过ADB命令导出ANR文件进行分析,线上我们可以使用FileObserver或ANR-WatchDog保存ANR堆栈信息,然后上传到服务器。
2.1导出ANR文件
 ANR发生之后我们可以使用以下命令导出ANR文件:

或者

 使用方法:

ANR-WatchDog
 Git地址: ANR-WatchDog
 ANR-WatchDog是一个非侵入式的ANR监控组件。
使用步骤:

ANR发生之后可直接在日志中查看堆栈信息:

 也可以在Application中监听ANR-WatchDog返回的错误日志。

原理
 ANRWatchDog继承子Thread,所以它最重要的就是run方法。核心内容可以分为以下几点:

 ANR异常我们可分为线上监测和线下监测两个方向

2. Android开发常见异常与错误系列(一)

一、前言

这系列文章是自己在平时开发过程中遇到的问题。之前只是记在云笔记上面,现在整理一下,发出来共享。

ps:像那些什么没有注册Activity呀,权限呀等最基本的就不再赘述。

二、ADB连接异常

有时我们发现,即使自己从任务管理器里面把adb.exe给干掉了,但还是不行,这时,你就可以尝试以下操作:

[2014-07-30 17:09:11 - QtActivity] The connection to adb is down, and a severe error has occured.

[2014-07-30 17:09:11 - QtActivity] You must restart adb and Eclipse.

[2014-07-30 17:09:11 - QtActivity] Please ensure that adb is correctly located at ‘D:\InstallFile\AndroidDevelop\ADT\sdk\platform-tools\adb.exe’ and can be executed.

adb起动失败:

1,杀掉其它的adb.exe看,如果不行,

2,看sdk\tools路径下面有没有

hprof-conv.exe

如果有,则把它复制到sdk\platform_tools下

3,如果没有,刚看sdk\platform_tools下有没有

hprof-conv.exe

如果有,刚复制到tools下。

4,如果两者都没有,刚下一个

hprof-conv.exe

三、java.lang.IllegalStateException: Activity has been destroyed

这个异常在切换Fragment中比较容易出现,稍不注意就会出现如下异常:

FATAL EXCEPTION: main12-0909:20:14.689: E/AndroidRuntime(31223): java.lang.IllegalStateException: Activity has been destroyed12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.init(DongTaiFragment.java:209)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.onCreateView(DongTaiFragment.java:68)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.handleCallback(Handler.java:605)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.dispatchMessage(Handler.java:92)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Looper.loop(Looper.java:154)12-0909:20:14.689: E/AndroidRuntime(31223): at android.app.ActivityThread.main(ActivityThread.java:4624)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invokeNative(Native Method)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invoke(Method.java:511)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)12-0909:20:14.689: E/AndroidRuntime(31223): at dalvik.system.NativeStart.main(Native Method)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

经查,说这个是当前android-support-v4版本的一个bug,因为在当fragment进行到detached状态时,它会重置它的内部状态。

然而,它并没有重置mChildFragmentManager.这导致在Fragment重新attach时,它(fragment)没有重新attachm childFragmentManager,从而引发了上面的异常.

解决方案:

在每个调用getChildFragmentManager()的fragment中复写onDetach()方法:

@OverridepublicvoidonDetach() {super.onDetach();try{Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");childFragmentManager.setAccessible(true);childFragmentManager.set(this,null);}catch(NoSuchFieldException e) {thrownewRuntimeException(e);}catch(IllegalAccessException e) {thrownewRuntimeException(e);}}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

四、java.lang.IllegalArgumentException: Illegal character in query at index

这个异常,在我们拼接请求参数时,可能会碰到,原因是里面的特殊字符转换异常。解决办法如下:

url转换问题

String url = baseUrl + “?” + “name=” + name + “&age=” + age;

url = url.replaceAll(“&”, “%26”);

url = url.replaceAll(” “, “%20”);

解释如下:

特殊符号替换符号

?%3F

&%26

|%124

=%3D

#%23

/%2F

+%2B

%%25

空格%20

五、eclipse连接小米2S调试程序的问题

虽然快2年没用过eclipse了,但这个问题还是贴出来,也许正好有正在用eclipse的同学遇到了此问题:

小米Mi2S连接到eclipse上无法识别。即使开启了调试模式,也无法识别.终于找到了一个可用的方法。

方法

用数据线连接手机和电脑。

打开手机拨号界面。

在拨号界面按 # #717717# # 自动就开启了。

在通知栏会出现一个 Diag USB port enable。

当然,应该是需要ROOT权限的。

这时候你的PC机会弹出安装设备驱动。

如果不成功,多插拔几次试试。

ok!安装完就搞定了!这时候打开eclipse就会在Driver里面看到你的手机了。

注意事项

在PC机上安装新硬件向导时候可能会遭遇到缺少dll文件,比如我就遇到缺少了WinUSBCoInstaller2.dll,这个问题。这时候就要去网上找找喽。这个东西分x64 和 x86的,注意不要搞错了!

如果先打开eclipse,再安装的话,可能导致eclipse挂掉,不明原因,可能是我机器配置不行。两次均有这种状况。所以建议先安装后再开eclipse。

3. androidstudio中怎么捕获异常

//可以使用try catch finally语句来捕获异常。

//代码格式:

try{
//如果要捕获异常,需要将代码放置在这try的代码块范围内
}catch(IOException ex){//异常范围IOException 以及它的派生类异常
//此处编写发生 IOException 或其派生类异常时处理方案
}catch(Exception ex){//异常范围Exception 以及它的派生类异常
//此处编写发生Exception 或其派生类异常时处理方案
}finally{
//此处无论上方的代码中是否出现了异常、return语句,这里必定执行。
}
/*
try catch语句至少需要有一个catch,却可以同时有多个catch。
其中catch语句块的异常范围从上到下顺序书写时应当从小范围到达范围,如果将Exception的catch与IOException的catch位置对换,那么永远不会执行IOException的catch块的代码
finally语句代码块是可选的。可以有它,也可以不使用它,具体是否启用它需要根据业务逻辑决定
*/

4. android 怎么捕获app异常闪退的日志

1、通过集成第三方SDK,如网络统计、友盟统计等

2、发版时使用加固工具,他们也会收集错误日志,如360加固
3、在程序中添加程序异常崩溃的捕捉代码,保存到本地文件中。

5. android 程序怎样捕捉全局异常

Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.()方法将异常处理类设置到线程上即可。
1、异常处理类,代码如下:

[java] view plain

public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;

private CrashHandler() {
}

public static CrashHandler getInstance() {
return INSTANCE;
}

public void init(Context ctx) {
mContext = ctx;
mDefaultHandler = Thread.();
Thread.(this);
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {
// if (!handleException(ex) && mDefaultHandler != null) {
// mDefaultHandler.uncaughtException(thread, ex);
// } else {
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(10);
// }
System.out.println("uncaughtException");

new Thread() {
@Override
public void run() {
Looper.prepare();
new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)
.setMessage("程序崩溃了...").setNeutralButton("我知道了", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
}
})
.create().show();
Looper.loop();
}
}.start();
}

/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
// new Handler(Looper.getMainLooper()).post(new Runnable() {
// @Override
// public void run() {
// new AlertDialog.Builder(mContext).setTitle("提示")
// .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)
// .create().show();
// }
// });

return true;
}
}

2、线程绑定异常处理类

[java] view plain

public class CrashHandlerActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this); //传入参数必须为Activity,否则AlertDialog将不显示。
// 创建错误
throw new NullPointerException();
}
}

6. android开发中什么时候要用捕捉异常

一种是必须要写的,系统会提示你要写,不写会报错的
二种就是你自己的需求,比如内存不够的时候你希望程序不直接死到影响用户体验,就可以在内存吃紧的地方加上异常捕获,然后对用户做出友好提示。

7. Android 捕获全局异常CrashHandler,防止异常闪退,记录异常日志

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.os.Build;

import android.os.Looper;

import android.widget.Toast;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.lang.Thread.UncaughtExceptionHandler;

import java.lang.reflect.Field;

import java.util.HashMap;

import java.util.Map;

/**

* UncaughtException handler class

*

*/

public class CrashHandler implements UncaughtExceptionHandler {

public static final String TAG = "CrashHandler";

public static final String PROGRAM_BROKEN_ACTION = "com.teligen.wccp.PROGRAM_BROKEN";

private UncaughtExceptionHandler mDefaultHandler;

private static CrashHandler instance = new CrashHandler();

private Context mContext;

private Class<?> mainActivityClass;

private Map<String, String> infos = new HashMap<String, String>();

private CrashHandler() {

}

public static CrashHandler getInstance() {

return instance;

}

public void init(Context context, Class<?> activityClass) {

mContext = context;

this.setMainActivityClass(activityClass);

mDefaultHandler = Thread.();

Thread.(this);

}

@Override

public void uncaughtException(Thread thread, Throwable ex) {

if (!handleException(ex) && mDefaultHandler != null) {

mDefaultHandler.uncaughtException(thread, ex);

} else {

System.out.println("uncaughtException--->" + ex.getMessage());

// Log.e(TAG, ex.getMessage());

logError(ex);

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

// Log.e("debug", "error:", e);

}

exitApp();

}

}

private boolean handleException(Throwable ex) {

if (ex == null) {

return false;

}

new Thread(new Runnable() {

@Override

public void run() {

Looper.prepare();

Toast.makeText(mContext.getApplicationContext(),

"unknown exception and exiting...Please checking logs in sd card!", Toast.LENGTH_LONG).show();

Looper.loop();

}

}).start();

collectDeviceInfo(mContext.getApplicationContext());

logError(ex);

return true;

}

private void exitApp() {

android.os.Process.killProcess(android.os.Process.myPid());

System.exit(0);

}

public void collectDeviceInfo(Context ctx) {

try {

PackageManager pm = ctx.getPackageManager();

PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),

PackageManager.GET_ACTIVITIES);

if (pi != null) {

String versionName = pi.versionName == null ? "null"

: pi.versionName;

String versionCode = pi.versionCode + "";

infos.put("versionName", versionName);

infos.put("versionCode", versionCode);

}

} catch (NameNotFoundException e) {

e.printStackTrace();

}

Field[] fields = Build.class.getDeclaredFields();

for (Field field : fields) {

try {

field.setAccessible(true);

infos.put(field.getName(), field.get(null).toString());

} catch (Exception e) {

}

}

}

private void logError(Throwable ex) {

StringBuffer sb = new StringBuffer();

for (Map.Entry<String, String> entry : infos.entrySet()) {

String key = entry.getKey();

String value = entry.getValue();

sb.append(key + "=" + value + "\n");

}

int num = ex.getStackTrace().length;

for (int i=0;i<num;i++){

sb.append(ex.getStackTrace()[i].toString());

sb.append("\n");

}

File file = new File(filePath+"/log.txt");

FileOutputStream fos = null;

try {

fos = new FileOutputStream(file);

fos.write((sb.toString()+"exception:"+ex.getLocalizedMessage()).getBytes());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally {

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

public Class<?> getMainActivityClass() {

return mainActivityClass;

}

public void setMainActivityClass(Class<?> mainActivityClass) {

this.mainActivityClass = mainActivityClass;

}

}

filePath是记录日志的路径

在Applicaton中初始化

@Override

public void onCreate() {

    super.onCreate();

    CrashHandler mCrashHandler = CrashHandler.getInstance();

    mCrashHandler.init(getApplicationContext(), getClass());

    initFile();

}

8. android全局捕获异常使用详解

2.2: 在自己程序中BaseApplication中的onCreate()方法设置全局异常捕捉类

2.3:直接在MainActivity的initData()初始化数据方法中,获取上次崩溃信息,然后打印即可

以上就是全局异常捕获及使用步骤,如若需要,直接拷贝到自己项目中即可使用

地址如下
https://www.jianshu.com/u/c5fabe27176e

9. 一段别人写的Android 全局捕获异常

已经上线的App,如果遇到异常就崩溃、闪退,给用户的体验就会很不友好。为了不崩溃,于是就会有全局捕获异常的做法。最近看到如下代码:

这段代码写在Application里。Handler那部分是处理主线程的。Thread.这一部分应该是处理所有线程的吧?难道它没有包含主线程吗?如果包含了主线程,那么上面Handler那一部分岂不是多余的吗?

10. Android 捕捉Intent 异常

try
{
Intent
intent
=
new
Intent();
intent.setClass(MainMenu.this,Diamond.class);
startActivity(intent);//启动一个新的activity
MainMenu.this.finish();
}
catch
(Exception
e)
{
Log.i("异常标签",e);//不要用e.printStackTrace();Android一般都不提倡使用
}

热点内容
日本免费云服务器色 发布:2025-04-05 04:58:52 浏览:863
linuxcpp 发布:2025-04-05 04:53:38 浏览:746
安卓字体哪个最好 发布:2025-04-05 04:46:37 浏览:649
什么是hdb3码编译码 发布:2025-04-05 04:40:20 浏览:504
编译原理运算符 发布:2025-04-05 04:37:50 浏览:520
如何用安卓手机玩ipad的账号 发布:2025-04-05 04:17:42 浏览:935
vivo手机怎么在桌面建文件夹 发布:2025-04-05 04:15:56 浏览:961
在线ftp网页版软件 发布:2025-04-05 04:15:02 浏览:624
android手机gps 发布:2025-04-05 04:14:59 浏览:446
页数算法 发布:2025-04-05 03:19:01 浏览:318