一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android異常處理最佳實踐

Android異常處理最佳實踐

2021-07-24 22:20希爾瓦娜斯女神 Android

這篇文章主要為大家詳細介紹了Android異常處理最佳實踐,介紹了一個優秀的app異常處理機制包括什么,感興趣的小伙伴們可以參考一下

一個好的app 異常處理機制 我認為應該至少包含以下幾個功能:

1.能把錯誤信息上傳到服務器  讓開發者可以持續改進app

2.錯誤信息至少應該包含 是否在主進程 是否在主線程 等可以幫助程序員定位的信息

3.最好包含手機硬件及軟件信息。

4.主進程引發的異常 最好交由系統自己處理 也就是讓用戶可以感知到 那種(當然你也可以自己定義一套更有意思的感知系統對話框等,具體可參考各種有意思的404界面)

5.子進程引發的異常最好別讓用戶感知到。比如push之類的 這種 和用戶感知弱關聯的這種。最好發生異常就直接kill掉即可。不要再交給系統處理。 

下面上代碼。

?
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
26
package com.example.administrator.exceptiontest;
 
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
 
/**
 * Created by Administrator on 2015/12/9.
 */
public class BaseApplication extends Application {
 
  public static Context mContext;
  //默認的異常處理
  public static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;
 
  @Override
  public void onCreate() {
    super.onCreate();
    mContext = this;
    //先取得默認的異常處理handler
    defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(new BaseUncaughtExceptionHandler());
  }
 
 
}
?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.example.administrator.exceptiontest;
 
import android.app.ActivityManager;
import android.content.Context;
import android.os.Looper;
 
/**
 * Created by Administrator on 2015/12/9.
 */
public class Utils {
 
  /**
   * 判斷是否在主線程中執行 如果是返回true 不是返回false
   */
  public static boolean isInMainThread() {
    //注意這個地方 我們無法一定可以取得myLooper的值的 比如說 你的thread 沒有綁定消息循環
    //那你的mylooper就返回的一定是null了,只有綁定了以后才會返回相應的值
    return Looper.myLooper() == Looper.getMainLooper();
  }
 
 
  //判斷是否是主進程 如果是 就返回true 否則返回false
  public static boolean isMainProcess(Context context)
  {
    return context.getPackageName().equals(getProcessName(context));
  }
 
  //取得進程名
  public static String getProcessName(Context context) {
    String currentProcessName = "";
    int pid = android.os.Process.myPid();
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
      if (processInfo.pid == pid) {
        currentProcessName = processInfo.processName;
        break;
      }
    }
    return currentProcessName;
  }
 
}

 

?
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
26
27
28
29
30
31
32
33
package com.example.administrator.exceptiontest;
 
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
 
/**
 * Created by Administrator on 2015/12/9.
 */
public class BaseUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
 
  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    Writer resultWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(resultWriter);
    ex.printStackTrace(printWriter);
    StringBuffer sb = new StringBuffer();
    sb.append("是否在主線程中發生異常" + Utils.isInMainThread() + "\n");
    sb.append("是否在主進程中發生異常" + Utils.isMainProcess(BaseApplication.mContext) + "\n");
    String errorReport = sb.toString() + resultWriter.toString();
    //這個地方最好把收集到的錯誤信息日志 上傳至服務器 便于開發者定位修改問題。
    //如果是主進程發生了異常 那還是交給系統自己默認的異常處理來做。讓用戶感知到,否則用戶啥都不知道 體驗并不好
    //你當然也可以自己定義特殊的錯誤提示 比如一些有意思的dialog什么的
    if (Utils.isMainProcess(BaseApplication.mContext)) {
      BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
    } else {
      //如果是子進程發生異常 不要給提示 直接殺掉子進程最好 別讓用戶感知到
      android.os.Process.killProcess(android.os.Process.myPid());
    }
  }
 
 
}

以上就是本文的全部內容,希望對大家學習Android軟件編程有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: yw在线观看成人免费 | 婷婷草| 黑帮大佬与我的365天2标清中文 | 欧美精品一区二区在线观看 | 亚洲精品无码久久不卡 | 久久r视频 | 热色综合| 日本卡一卡2卡3卡4精品卡无人区 | 碰91精品国产91久久婷婷 | 亚洲狠狠网站色噜噜 | 热久久亚洲 | 91精品国产综合久 | 亚洲国产日韩欧美一区二区三区 | 国产乱妇无码大片在线观看 | 日本免费不卡在线一区二区三区 | 青春草在线观看精品免费视频 | 欧美日韩国产一区二区三区不卡 | 美女脱小内内给男生摸j | 公翁的舌尖研磨她的花蒂小说 | 我的绝色岳每雯雯 | 爱爱调教 | 国产小视频在线播放 | 无限观看社区在线视频 | 日本护士撒尿xxxx欧美 | 乌克兰肥熟 | 男人使劲躁女人小视频 | 99精品国产高清一区二区三区香蕉 | 亚洲国产精品久久久久 | 啊好爽视频 | gogort99人体专业网站 | 日本黄色大片免费观看 | 国产自在自拍 | 欧美亚洲一区二区三区 | 日日碰碰 | 蜜桃在线 | 国产精品久久久久久久久99热 | 国产精品久久久久无毒 | 成人精品一区久久久久 | 玩高中女同桌肉色短丝袜脚文 | 精品久久久久久久久久香蕉 | 日韩视频在线精品视频免费观看 |