国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程實現項目中異常捕獲及對應Log日志文件保存功能

2019-10-22 18:14:48
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現項目中異常捕獲及對應Log日志文件保存功能。分享給大家供大家參考,具體如下:

做程序開發,肯定離不開與BUG打交道,更加離不開程序異常的出現。在開發的時候,我們可以通斷點調試,日志打印,異常捕獲工具等方式發現或處理程序中的Exception。那客戶在使用我們的應用時,程序了問題,我們怎么可以知道呢?當然,我們可以加上友盟統計等第三方工具。另外還能怎么做呢?那就是把異常信息通過文檔地形式保存下來,如果用戶在使用的時候程序出了異常,可以讓用戶把對應的日志信息發給我們或客服人員,更好的是在程序中做好處理,把日志發到指定服務器(程序中記得添加網絡權限哦)中,我們也可以拿到日志,我們就能發現問題,處理問題啦。

異常捕獲的關鍵代碼:

/** * UncaughtExceptionHandler:線程未捕獲異常控制器是用來處理未捕獲異常的。 實現該接口并注冊為程序中的默認未捕獲異常處理 * 這樣當未捕獲異常發生時,就可以做些異常處理操作 例如:收集異常信息,發送錯誤報告 等。 * * @description: * @author ldm * @date 2016-4-18 上午11:31:19 */public class MyExceptionHandler implements UncaughtExceptionHandler {  // 上下文  private Context mContext;  // 是否打開上傳  public boolean openUpload = true;  // Log文件路徑  private static final String LOG_FILE_DIR = "log";  // log文件的后綴名  private static final String FILE_NAME = ".log";  private static MyExceptionHandler instance = null;  // 系統默認的異常處理(默認情況下,系統會終止當前的異常程序)  private UncaughtExceptionHandler mDefaultCrashHandler;  private MyExceptionHandler(Context cxt) {    // 獲取系統默認的異常處理器    mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();    // 將當前實例設為系統默認的異常處理器    Thread.setDefaultUncaughtExceptionHandler(this);    // 獲取Context,方便內部使用    this.mContext = cxt.getApplicationContext();  }  public synchronized static MyExceptionHandler create(Context cxt) {    if (instance == null) {      instance = new MyExceptionHandler(cxt);    }    return instance;  }  /**   * 當程序中有未被捕獲的異常,系統將會自動調用#uncaughtException方法   * thread為出現未捕獲異常的線程,ex為未捕獲的異常,有了這個ex,我們就可以得到異常信息。   */  @Override  public void uncaughtException(Thread thread, Throwable ex) {    try {      // 保存導出異常日志信息到SD卡中      saveToSDCard(ex);    } catch (Exception e) {      e.printStackTrace();    } finally {      // 如果系統提供了默認的異常處理器,則交給系統去結束我們的程序,否則就由我們自己結束自己      Toast.makeText(mContext,          "很抱歉,程序出錯,即將退出:/r/n" + ex.getLocalizedMessage(),          Toast.LENGTH_LONG).show();      if (mDefaultCrashHandler != null) {        mDefaultCrashHandler.uncaughtException(thread, ex);      } else {        ex.printStackTrace();      }    }  }  /**   * 保存文件到SD卡   *   * @description:   * @author ldm   * @date 2016-4-18 上午11:37:17   */  private void saveToSDCard(Throwable ex) throws Exception {    File file = FileUtil.getAppointFile(mContext.getPackageName()        + File.separator + LOG_FILE_DIR,        getDataTime("yyyy-MM-dd-HH-mm-ss") + FILE_NAME);    PrintWriter pw = new PrintWriter(new BufferedWriter(        new FileWriter(file)));    // 導出發生異常的時間    pw.println(getDataTime("yyyy-MM-dd-HH-mm-ss"));    // 導出手機信息    savePhoneInfo(pw);    pw.println();    // 導出異常的調用棧信息    ex.printStackTrace(pw);    pw.close();  }  /**   * 保存手機硬件信息   *   * @description:   * @author ldm   * @date 2016-4-18 上午11:38:01   */  private void savePhoneInfo(PrintWriter pw) throws NameNotFoundException {    // 應用的版本名稱和版本號    PackageManager pm = mContext.getPackageManager();    PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(),        PackageManager.GET_ACTIVITIES);    pw.print("App Version: ");    pw.print(pi.versionName);    pw.print('_');    pw.println(pi.versionCode);    pw.println();    // android版本號    pw.print("OS Version: ");    pw.print(Build.VERSION.RELEASE);    pw.print("_");    pw.println(Build.VERSION.SDK_INT);    pw.println();    // 手機制造商    pw.print("Manufacturer: ");    pw.println(Build.MANUFACTURER);    pw.println();    // 手機型號    pw.print("Model: ");    pw.println(Build.MODEL);    pw.println();  }  /**   * 根據時間格式返回時間   *   * @description:   * @author ldm   * @date 2016-4-18 上午11:39:30   */  private String getDataTime(String format) {    SimpleDateFormat df = new SimpleDateFormat(format);    return df.format(new Date());  }}

使用的時候,我們需要在Application中初始化:

public class MyApplication extends Application {  @Override  public void onCreate() {    super.onCreate();    MyExceptionHandler.create(this);  }}

在AndroidManifest.xml文件中注冊好Application:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.ldm.exception"  android:versionCode="1"  android:versionName="1.0" >  <uses-sdk    android:minSdkVersion="8"    android:targetSdkVersion="21" />  <uses-permission android:name="android.permission.INTERNET" />  <application    android:name="com.ldm.exception.MyApplication"    android:allowBackup="true"    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppTheme" >    <activity      android:name="com.ldm.activity.MainActivity"      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>

文件上傳的方法有寫好,但是沒有具體實現,比如一但有日志文件就上傳或是日志文件達到一定大小再上傳,這就要根據實際情況來定啦。

當我們應用出現異常時,在手機文件夾中存在我們應用包名的文件夾,里面就有日志文件。

附:完整Demo點擊此處本站下載

希望本文所述對大家Android程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 衡阳县| 临潭县| 高台县| 连平县| 始兴县| 石首市| 虞城县| 保康县| 墨竹工卡县| 徐州市| 海城市| 威海市| 扶沟县| 湛江市| 藁城市| 拉萨市| 西华县| 成都市| 勃利县| 丰都县| 河东区| 枣庄市| 四川省| 来凤县| 马关县| 民权县| 蓝山县| 兴仁县| 苗栗市| 崇左市| 建始县| 阳曲县| 微博| 达州市| 德化县| 蓝田县| 泽普县| 竹北市| 柘城县| 沂南县| 科技|