CrashLog
来源:互联网 发布:seo三大标签 编辑:程序博客网 时间:2024/06/10 00:53
异常处理类java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为了当 Thread 因未捕获的异常而突然终止时,调用处理程序。 接口下面有setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 方法,方法主要作用为设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序 自定义系统的Crash捕捉类,用Toast替换系统的对话框* 将软件版本信息,设备信息,出错信息保存在sd卡中,你可以上传到服务器中
(1)MyActivity类
package com.ncs.CustomCrash;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.TextView;public class MyActivity extends Activity { /** * 存在空指针异常 * Called when the activity is first created. */ TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);// mTextView.setText("crash"); } public void tosubactivity(View v){ Intent it = new Intent(this,SubActivity.class); Student data = new Student(); it.putExtra("data",data); this.startActivity(it); }}
(2)CrashApplication类
package com.ncs.CustomCrash;import android.app.Application;/** * Created by yeyy on 6/17/2015. */public class CrashApplication extends Application { @Override public void onCreate() { super.onCreate(); CustomCrashHandler mCustomCrashHandler = CustomCrashHandler.getInstance(); mCustomCrashHandler.setCustomCrashHanler(getApplicationContext()); }}(3)CustomCrashHandler类
(4)AndroidManifest.xmlpackage com.ncs.CustomCrash;import java.io.File;import java.io.FileOutputStream;import java.io.PrintWriter;import java.io.StringWriter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.TimeZone;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.Environment;import android.os.Looper;import android.util.Log;import android.widget.Toast;/** * Created by yeyy on 6/17/2015. *//** * 异常处理类 * java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为了 * 当 Thread 因未捕获的异常而突然终止时,调用处理程序。 * 接口下面有setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) * 方法,方法主要作用为设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序 * 自定义系统的Crash捕捉类,用Toast替换系统的对话框 * 将软件版本信息,设备信息,出错信息保存在sd卡中,你可以上传到服务器中 */public class CustomCrashHandler implements Thread.UncaughtExceptionHandler{ private static final String TAG = "Activity"; private Context mContext;//程序的context对象 private static final String SDCARD_ROOT = Environment.getExternalStorageDirectory().toString(); //CrashHandler实例 private static CustomCrashHandler mInstance = new CustomCrashHandler(); private CustomCrashHandler(){} /** * 单例模式,保证只有一个CustomCrashHandler实例存在 * @return */ public static CustomCrashHandler getInstance(){ return mInstance; } /** * 异常发生时,系统回调的函数,我们在这里处理一些操作 */ @Override public void uncaughtException(Thread thread, Throwable ex) { //将一些信息保存到SDcard中 savaInfoToSD(mContext, ex); //提示用户程序即将退出 showToast(mContext, "很抱歉,程序遭遇异常,即将退出!"); try { thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }// android.os.Process.killProcess(android.os.Process.myPid());// System.exit(1); //完美退出程序方法 ExitAppUtils.getInstance().exit(); } /** * 为我们的应用程序设置自定义Crash处理 */ public void setCustomCrashHanler(Context context){ mContext = context; Thread.setDefaultUncaughtExceptionHandler(this); } /** * 显示提示信息,需要在线程中显示Toast * @param context * @param msg */ private void showToast(final Context context, final String msg){ new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); Looper.loop(); } }).start(); } /** * 获取一些简单的信息,软件版本,手机版本,型号等信息存放在HashMap中 * @param context * @return */ private HashMap<String, String> obtainSimpleInfo(Context context){ HashMap<String, String> map = new HashMap<String, String>(); PackageManager mPackageManager = context.getPackageManager(); PackageInfo mPackageInfo = null; try { mPackageInfo = mPackageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES); } catch (NameNotFoundException e) { e.printStackTrace(); } map.put("versionName", mPackageInfo.versionName); map.put("versionCode", "" + mPackageInfo.versionCode); map.put("MODEL", "" + Build.MODEL); map.put("SDK_INT", "" + Build.VERSION.SDK_INT); map.put("PRODUCT", "" + Build.PRODUCT); return map; } /** * 获取系统未捕捉的错误信息 * @param throwable * @return */ private String obtainExceptionInfo(Throwable throwable) { StringWriter mStringWriter = new StringWriter(); PrintWriter mPrintWriter = new PrintWriter(mStringWriter); throwable.printStackTrace(mPrintWriter); mPrintWriter.close(); Log.e(TAG, mStringWriter.toString()); return mStringWriter.toString(); } /** * 保存获取的 软件信息,设备信息和出错信息保存在SDcard中,但是看不到? * @param context * @param ex * @return */ private String savaInfoToSD(Context context, Throwable ex){ String fileName = null; StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : obtainSimpleInfo(context).entrySet()) { String key = entry.getKey(); String value = entry.getValue(); sb.append(key).append(" = ").append(value).append("\n"); } sb.append(obtainExceptionInfo(ex)); if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File dir = new File(SDCARD_ROOT + File.separator + "crash" + File.separator); if(! dir.exists()){ dir.mkdir(); } try{ fileName = dir.toString() + File.separator + paserTime(System.currentTimeMillis()) + ".log"; FileOutputStream fos = new FileOutputStream(fileName); fos.write(sb.toString().getBytes()); fos.flush(); fos.close(); }catch(Exception e){ e.printStackTrace(); } } return fileName; } /** * 将毫秒数转换成yyyy-MM-dd-HH-mm-ss的格式 * @param milliseconds * @return */ private String paserTime(long milliseconds) { System.setProperty("user.timezone", "Asia/Shanghai"); TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai"); TimeZone.setDefault(tz); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); String times = format.format(new Date(milliseconds)); return times; }}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ncs.CustomCrash" android:versionCode="1" android:versionName="1.0"> <!--<uses-sdk android:minSdkVersion="19"/>--> <uses-permission android:name="android.permission.write_external_storage"/> <!--注意android:name=".CrashApplication"--> <application android:name=".CrashApplication" android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MyActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="SubActivity"/> </application></manifest>(5)Layout文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/but" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, MyActivity" android:onClick="tosubactivity" /></LinearLayout>
源码下载地址:http://download.csdn.net/detail/csdnyuandaimaxuexi/8968317
log文件的保存位置如图显示
0 0
- CrashLog
- unity crashlog
- iOS crashlog符号化方法
- CrashLog与dSYM二三事
- 如何识别crashlog
- 如何手动解析CrashLog
- 如何手动解析CrashLog
- 如何手动解析CrashLog
- 如何手动解析CrashLog
- XCode CrashLog符号化分析
- iOS开发 -- 分析CrashLog (2) 无dsym文件解crashlog
- Xcode分析CrashLog的方法
- 分析IOS CrashLog的方法
- Xcode分析CrashLog的方法
- Xcode分析CrashLog的方法
- Xcode分析CrashLog的方法
- Xcode分析CrashLog的方法
- Xcode分析CrashLog的方法
- C#高级编程七十三天----浅析C#中内存管理
- 自行集成极光推送所遇到的一个错误::java.lang.UnsatisfiedLinkError:
- ol有序列表属性
- 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment
- 【codevs】p1018 单词接龙
- CrashLog
- 配置openvpn使用账号、密码方式验证登录
- solr4.3配置主从同步
- 申请苹果公司版开发者账号实录【99美元,非299美元企业版账号】
- Pascal's Triangle
- this is often breadth players low cost cheap cabal 2 alz
- 如何关闭AlertDialog.Builder对话框
- 线程安全与并发安全探究(三)--servlet多线程并发问题
- iOS项目的重命名方法完整图文教程