Thread.setDefaultUncaughtExceptionHandler (new CrashHandler(getAppContext() ) );
public class CrashHandler implements Thread .UncaughtExceptionHandler {
public static final int MAX_CRASH_LOG_LENGTH = 5000 ;
private Context mAppContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
public CrashHandler (Context appContext) {
mAppContext = appContext;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
}
@Override
public void uncaughtException (Thread thread, Throwable ex) {
if (ex == null ) {
return ;
}
ex.printStackTrace();
Writer result = new StringWriter();
PrintWriter printWriter = new PrintWriter(result);
ex.printStackTrace(printWriter);
String callStack = result.toString();
if (callStack.length() > MAX_CRASH_LOG_LENGTH) {
callStack = callStack.substring(0 , MAX_CRASH_LOG_LENGTH);
}
String exceptionClass = (ex == null ) ? "" : ex.getStackTrace()[0 ].getClassName();
String exceptionMethod = (ex == null ) ? "" : ex.getStackTrace()[0 ].getMethodName();
final List<KeyValuePair> params = new ArrayList<>();
final Object syncLock = new Object();
Runnable runnable = new Runnable() {
@Override
public void run () {
okhttp3.Request okRequest = new okhttp3.Request.Builder()
.url(url)
.post(KeyValuePairUtil.getRequestBody(params))
.build();
Call call = getOkHttpClient().newCall(okRequest);
call.enqueue(new Callback() {
@Override
public void onFailure (Call call, IOException e) {
synchronized (syncLock) {
syncLock.notify();
}
}
@Override
public void onResponse (Call call, Response response) throws IOException {
synchronized (syncLock) {
syncLock.notify();
}
}
});
}
};
if (Looper.myLooper() == null ) {
mUiHandler.post(runnable);
} else {
runnable.run();
}
synchronized (syncLock) {
try {
syncLock.wait();
} catch (InterruptedException e) {
}
}
if (mDefaultHandler != null ) {
mDefaultHandler.uncaughtException(thread, ex);
}
}
}