当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现捕获未知异常并提交给服务器的方法

Android实现捕获未知异常并提交给服务器的方法

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了android实现捕获未知异常并提交给服务器的方法。分享给大家供大家参考,具体如下:

在android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助

为了实现这样的效果,我们需要做如下工作

写一个类实现uncaughtexceptionhandler接口,重写uncaughtexception方法

功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者

public class myuncaughtexceptionhandler implements uncaughtexceptionhandler {
  private static final string tag = "myuncaughtexceptionhandler";
  // 将错误信息保存到sharepreference中
  private static sharedpreferences bugpreferences;
  private static sharedpreferences.editor bugeditor;
  private static context mcontext;
  private static packageinfo packageinfo;
  private uncaughtexceptionhandler defaultuncaughtexceptionhandler;
  private static handleprogressdialog progressdialog;
  // 保存错误原因的字段
  private static string bugexiststr = "";
  private static handler handler = new handler() {
    @override
    public void handlemessage(message msg) {
      progressdialog.dismiss();
    }
  };
  public myuncaughtexceptionhandler(context context) {
    try {
      mcontext = context;
      packageinfo = context.getpackagemanager().getpackageinfo(
          context.getpackagename(), 0);
      bugpreferences = context.getsharedpreferences("bug", 0);
      bugeditor = bugpreferences.edit();
      defaultuncaughtexceptionhandler = thread
          .getdefaultuncaughtexceptionhandler();
    } catch (namenotfoundexception e) {
      e.printstacktrace();
    } catch (exception e) {
      e.printstacktrace();
    }
  }
  // 当异常发生时,会调用这个方法
  public void uncaughtexception(thread th, throwable t) {
    try {
      // 保存bug
      savebugtext(t);
      defaultuncaughtexceptionhandler.uncaughtexception(th, t);
    } catch (filenotfoundexception e) {
      e.printstacktrace();
    } catch (exception e) {
      e.printstacktrace();
    }
  }
  private void savebugtext(throwable ex) throws filenotfoundexception {
    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();
    bugeditor.putstring("bugtext", writer.tostring());
    bugeditor.commit();
  }
  // 下次开启应用的时候,如果上次产生了未知异常则显示对话框应用与用户反馈
  public static void showbugreportdialog(final context context) {
    bugexiststr = context.getsharedpreferences("bug", 0).getstring(
        "bugtext", "");
    if (bugexiststr != null && !bugexiststr.equals("")) {
      alertdialog.builder builder = new alertdialog.builder(context);
      builder.settitle(r.string.bug_report);
      builder.setmessage(r.string.whether_report_to_developer);
      builder.setnegativebutton(r.string.cancel, new onclicklistener() {
        public void onclick(dialoginterface dialog, int which) {
          finish(dialog);
        }
      });
      builder.setpositivebutton(r.string.send, new onclicklistener() {
        public void onclick(dialoginterface dialog, int which) {
          // 提交bug到服务器
          postbugreportinbackground(context);
          dialog.dismiss();
        }
      });
      alertdialog dialog = builder.create();
      dialog.show();
    }
  }
  private static void postbugreportinbackground(final context context) {
    progressdialog = new handleprogressdialog(context);
    progressdialog.show();
    new thread(new runnable() {
      public void run() {
        postbugreport();
        // 将之前的bug信息清除掉
        if (bugexiststr != null) {
          bugeditor.putstring("bugtext", "");
          bugeditor.commit();
        }
        handler.sendemptymessage(0);
      }
    }).start();
  }
  /**
   * send bug report.
   */
  private static void postbugreport() {
    list<namevaluepair> nvps = new arraylist<namevaluepair>();
    nvps.add(new basicnamevaluepair("device", build.device));
    nvps.add(new basicnamevaluepair("model", build.model));
    nvps.add(new basicnamevaluepair("sdk-version", build.version.sdk));
    nvps.add(new basicnamevaluepair("apk-version", packageinfo.versionname));
    nvps.add(new basicnamevaluepair("bug", bugexiststr));
    try {
      httppost httppost = new httppost(constants.baseurl
          + "c=main&a=androidcrash");
      httppost.setentity(new urlencodedformentity(nvps, http.utf_8));
      defaulthttpclient httpclient = new defaulthttpclient();
      httpparams params = httpclient.getparams();
      httpconnectionparams.setconnectiontimeout(params, 5000);
      httpconnectionparams.setsotimeout(params, 5000);
      httpclient.execute(httppost);
    } catch (ioexception e) {
      e.printstacktrace();
    } catch (exception e) {
      e.printstacktrace();
    }
  }
  private static void finish(dialoginterface dialog) {
    if (bugexiststr != null) {
      bugeditor.putstring("bugtext", "");
      bugeditor.commit();
    }
    dialog.dismiss();
  }
}

在需要捕捉异常的地方调用

@override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    appapplication = (appapplication) getapplication();
    appapplication.activites.add(this);
    initviews();
    thread.setdefaultuncaughtexceptionhandler(new myuncaughtexceptionhandler(
        mainactivity.this));
    myuncaughtexceptionhandler.showbugreportdialog(this);
  }

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网