当捕获到异常时把异常的关键信息打印出来
import android.content.Context import android.graphics.Color import android.graphics.PixelFormat import android.view.Gravity import android.view.View import android.view.WindowManager import android.widget.TextView import java.io.FileNotFoundException /** * Created by lin on 2017/5/21. */ //实现OnClickLintener接口 class ExceptionUtils : View.OnClickListener { override fun onClick(v: View?) { dismiss() } private var mContext: Context? = null // 用来往顶层布局加或删视图 private var mWm: WindowManager? = null // 吐司展示的布局 private var mView: TextView? = null // 布局参数对象 private var mParams: WindowManager.LayoutParams? = null constructor(context: Context) { mContext = context mWm = mContext?.getSystemService(Context.WINDOW_SERVICE) as WindowManager mParams = WindowManager.LayoutParams() mParams?.width = WindowManager.LayoutParams.MATCH_PARENT // layout_height mParams?.height = WindowManager.LayoutParams.WRAP_CONTENT // gravity mParams?.gravity = Gravity.CENTER mParams?.format = PixelFormat.TRANSPARENT// mParams?.x = 100 mParams?.y = 100 // 类型 mParams?.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE // 特殊属性 mParams?.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE } fun show(exception: Exception,name:String) { dismiss() //创建TextView mView = TextView(mContext) mView?.setBackgroundColor(Color.GREEN) exception.printStackTrace() var content: String = "" val stackTrace = exception.stackTrace if (stackTrace.size > 0) { var error: String = "" if (exception is NullPointerException) { error = "NullPointerException(空指针异常)" } else if (exception is IllegalArgumentException) { error = "IllegalArgumentException(非法参数异常)" } else if (exception is ClassNotFoundException) { error = "ClassNotFoundException(找不到这个类(使用反射可能出现))" } else if (exception is FileNotFoundException) { error = "FileNotFoundException(找不到文件夹)" }else if (exception is ArithmeticException) { error = "ArithmeticException(计算异常)" }else if (exception is ArrayIndexOutOfBoundsException) { error = "ArrayIndexOutOfBoundsException(数组越界异常)" } else if (exception is RuntimeException) { error = "RuntimeException(运行时异常)" } var index: Int = 0 for (i in 0..stackTrace.size - 1) { val element = stackTrace.get(i) if (element.className.equals(name)) { index = i break } } content = "class:" + stackTrace[index].className + "\n lineNumber:" + stackTrace[index].lineNumber + "\n caused:" + exception.message + "\n error:" + error } mView?.text=content mView?.setOnClickListener(this) // 将TextView加到window mWm?.addView(mView, mParams)// 1.布局 2.布局参数对象 } fun dismiss() { if (mView != null) { mWm?.removeView(mView) mView = null } } }
在window需要 权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
测试
布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button" android:text="计算" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
activity
import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.View import com.newframwork.utils.ExceptionUtils import kotlinx.android.synthetic.main.activity_main2.* class Main2Activity : AppCompatActivity(), View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) //不需要findViewById,导对包就能只接用id做变量 button.setOnClickListener(this) } override fun onClick(v: View?) { if (v?.id == R.id.button) { try { var i:Int = 10/0; } catch (e: Exception) { e.printStackTrace() ExceptionUtils(this).show(e,javaClass.name); } } } }
作者:敲代码的皮皮虾