当前位置: 首页 > news >正文

行业网站建设教程软文推广渠道主要有

行业网站建设教程,软文推广渠道主要有,岳阳找工作网站,网站建设规划方案包括转载 https://blog.csdn.net/lvxiaobo1994/article/details/83056274 android 捕获app异常崩溃堆栈信息,只需要2步:继承创建一个自定义的处理UncaughtExceptionHandler 类,然后在应用程序的启动类onCreate 方法中 初始化启动 即可。若要写入…

转载
https://blog.csdn.net/lvxiaobo1994/article/details/83056274

android 捕获app异常崩溃堆栈信息,只需要2步:继承创建一个自定义的处理UncaughtExceptionHandler 类,然后在应用程序的启动类onCreate 方法中 初始化启动 即可。若要写入sd卡,需要读写权限

一 创建继承 Thread.UncaughtExceptionHandler 的自定义类,捕获app UncaughtException 异常

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.**  需要在Application中注册,为了要在程序启动器就监控整个程序。*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG = "CrashHandler";//系统默认的UncaughtException处理类private Thread.UncaughtExceptionHandler mDefaultHandler;//CrashHandler实例private static CrashHandler instance;//程序的Context对象private Context mContext;//用来存储设备信息和异常信息private Map<String, String> infos = new HashMap<String, String>();//用于格式化日期,作为日志文件名的一部分private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");/** 保证只有一个CrashHandler实例 */private CrashHandler() {}/** 获取CrashHandler实例 ,单例模式 */public static CrashHandler getInstance() {if(instance == null)instance = new CrashHandler();return instance;}/*** 初始化*/public void init(Context context) {mContext = context;//获取系统默认的UncaughtException处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();//设置该CrashHandler为程序的默认处理器Thread.setDefaultUncaughtExceptionHandler(this);}/*** 当UncaughtException发生时会转入该函数来处理*/@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {//如果用户没有处理则让系统默认的异常处理器来处理mDefaultHandler.uncaughtException(thread, ex);} else {try {Thread.sleep(2000);} catch (InterruptedException e) {Log.e(TAG, "error : ", e);}//退出程序// AppManager.finishAllActivity();android.os.Process.killProcess(android.os.Process.myPid());}}/*** 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.** @param ex* @return true:如果处理了该异常信息;否则返回false.*/private boolean handleException(Throwable ex) {if (ex == null) {return false;}//收集设备参数信息collectDeviceInfo(mContext);//使用Toast来显示异常信息new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "Sorry, the program has an exception, aborting.", Toast.LENGTH_SHORT).show();Looper.loop();}}.start();//保存日志文件saveCatchInfo2File(ex);return true;}/*** 收集设备参数信息* @param ctx*/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 (PackageManager.NameNotFoundException e) {Log.e(TAG, "an error occured when collect package info", e);}Field[] fields = Build.class.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);infos.put(field.getName(), field.get(null).toString());Log.d(TAG, field.getName() + " : " + field.get(null));} catch (Exception e) {Log.e(TAG, "an error occured when collect crash info", e);}}}/*** 保存错误信息到文件中** @param ex* @return  返回文件名称,便于将文件传送到服务器*/private String saveCatchInfo2File(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");}Writer writer = new StringWriter();PrintWriter printWriter = new PrintWriter(writer);ex.printStackTrace(printWriter);Throwable cause = ex.getCause();while (cause != null) {cause.printStackTrace(printWriter);cause = cause.getCause();}printWriter.close();String result = writer.toString();sb.append(result);Log.e("error","app UncaughtException : " + sb.toString());//保存sd卡,需要读写权限try {long timestamp = System.currentTimeMillis();String time = formatter.format(new Date());String fileName = "crash-" + time + "-" + timestamp + ".log";if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String path = "/mnt/sdcard/crash/";File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}FileOutputStream fos = new FileOutputStream(path + fileName);fos.write(sb.toString().getBytes());//发送给开发人员sendCrashLog2PM(path+fileName);fos.close();}return fileName;} catch (Exception e) {Log.e(TAG, "an error occured while writing file...", e);}return null;}/*** 将捕获的导致崩溃的错误信息发送给开发人员** 目前只将log日志保存在sdcard 和输出到LogCat中,并未发送给后台。*/private void sendCrashLog2PM(String fileName){if(!new File(fileName).exists()){Toast.makeText(mContext, "日志文件不存在!", Toast.LENGTH_SHORT).show();return;}FileInputStream fis = null;BufferedReader reader = null;String s = null;try {fis = new FileInputStream(fileName);reader = new BufferedReader(new InputStreamReader(fis, "GBK"));while(true){s = reader.readLine();if(s == null) break;//由于目前尚未确定以何种方式发送,所以先打出log日志。Log.e("error","UncaughtException : " + s.toString());}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{   // 关闭流try {reader.close();fis.close();} catch (IOException e) {e.printStackTrace();}}}
}

二 应用程序入口启动类中 初始化启动 自定义捕获 UncaughtException 异常 类

public class XxxApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//初始化 捕获app UncaughtException 异常CrashHandler catchHandler = CrashHandler.getInstance();catchHandler.init(getApplicationContext());//todo//...}
}

注意: 如果要写入到sd卡,需要读写权限

http://www.lbrq.cn/news/2651329.html

相关文章:

  • 昆明网站建设一条龙服务交换友情链接的渠道有哪些
  • 三站合一网站建设有域名和服务器怎么建网站
  • wordpress建站教程阿里云seo薪资
  • 开家给别人做网站公司搜索引擎优化自然排名的优点
  • 自己如何做网站优化外贸网站建设设计方案
  • 深圳沙井公司网站建设sem和seo是什么意思
  • 做网站有必要注册商标吗今日国际新闻热点
  • 做网站送商标新闻稿营销
  • 青岛网站建设定制网络营销专业学什么
  • 廊坊做网站的电话宣传推广计划
  • 微信导航网站怎么做的优化网站怎么做
  • 数据库对于做网站的重要性如何免费创建自己的平台
  • nanopi neo做网站刷移动端seo软件
  • 找人做网站都需要提供什么品牌营销策略论文
  • 站长工具推荐谷歌google浏览器
  • 做网站建设怎么找客户乐云seo官网
  • 制作音乐的软件app如何优化百度seo排名
  • 西安网站建设公司云网网络销售管理条例
  • 服务器上的网站不能访问怎么让关键词快速排名首页
  • 政府网站建设分析企业优化推广
  • 易语言做网站登陆个人网站免费域名注册
  • 有哪些做文创产品的网站短链接生成网址
  • 重庆有没有做网站的免费seo网站自动推广软件
  • .电子商务网站建设的核心是网店推广费用多少钱
  • 网站哪家公司好免费b站动漫推广网站2023
  • 手机百度 网站提交现在学seo课程多少钱
  • 买完域名怎么创建网站软文网站发布平台
  • 宝马itms做课网站百度云网盘
  • 网站做测试怎样做佛山关键词排名工具
  • 中英双语网站网络推广公司企业
  • drippingblues靶机
  • 学习:JS[8]本地存储+正则表达式
  • rotary_emb 位置编码 加速
  • 【排序算法】②希尔排序
  • PromptPilot打造高效AI提示词
  • 柠檬笔试——野猪骑士