Add DefaultUncaughtException for global error processing

Signed-off-by: Leo Ma <begeekmyfriend@gmail.com>
camera2
Leo Ma 9 years ago
parent ff98ae24c6
commit 62bb4823c4

@ -7,8 +7,7 @@ import android.hardware.Camera.Size;
import android.media.AudioRecord; import android.media.AudioRecord;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.os.Looper;
import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -18,6 +17,8 @@ import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -37,7 +38,7 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback, Ca
private byte[] mYuvFrameBuffer; private byte[] mYuvFrameBuffer;
private SrsEncoder mEncoder; private SrsEncoder mEncoder;
private String mErrMsg;
// settings storage // settings storage
private SharedPreferences sp; private SharedPreferences sp;
@ -125,6 +126,31 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback, Ca
} }
} }
}); });
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Toast.makeText(getApplicationContext(), ex.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
});
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
mErrMsg = ex.getMessage();
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(getApplicationContext(), mErrMsg, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
stopPublish();
btnPublish.setEnabled(true);
btnStop.setEnabled(false);
}
});
} }
@Override @Override

@ -143,8 +143,7 @@ public class SrsRtmp {
public void run() { public void run() {
try { try {
cycle(); cycle();
} catch (InterruptedException ie) { } catch (IOException e) {
} catch (Exception e) {
Log.i(TAG, "worker: thread exception."); Log.i(TAG, "worker: thread exception.");
e.printStackTrace(); e.printStackTrace();
} }
@ -245,22 +244,20 @@ public class SrsRtmp {
sequenceHeaderOk = false; sequenceHeaderOk = false;
} }
private void reconnect() throws IllegalStateException, IOException { private void connect() throws IllegalStateException, IOException {
if (!connected) { if (!connected) {
//disconnect(); Log.i(TAG, String.format("worker: connecting to RTMP server by url=%s\n", url));
Log.i(TAG, String.format("worker: connecting to SRS by url=%s\n", url));
publisher = new SrsRtmpPublisher(url); publisher = new SrsRtmpPublisher(url);
publisher.connect(); publisher.connect();
publisher.publish("live"); publisher.publish("live");
Log.i(TAG, String.format("worker: connect to SRS by url=%s\n", url)); Log.i(TAG, String.format("worker: connect to RTMP server by url=%s\n", url));
connected = true; connected = true;
} }
clearCache(); clearCache();
} }
private void cycle() throws Exception { private void cycle() throws IOException {
// create the handler. // create the handler.
Looper.prepare(); Looper.prepare();
looper = Looper.myLooper(); looper = Looper.myLooper();
@ -272,14 +269,14 @@ public class SrsRtmp {
return; return;
} }
SrsFlvFrame frame = (SrsFlvFrame)msg.obj; SrsFlvFrame frame = (SrsFlvFrame)msg.obj;
try {
// only reconnect when got keyframe. // only reconnect when got keyframe.
try {
// only connect when got keyframe.
if (frame.is_keyframe()) { if (frame.is_keyframe()) {
reconnect(); connect();
} }
} catch (Exception e) { } catch (IOException e) {
Log.e(TAG, String.format("worker: reconnect failed. e=%s", e.getMessage())); Thread.getDefaultUncaughtExceptionHandler().uncaughtException(worker, e);
disconnect();
} }
try { try {
@ -309,7 +306,7 @@ public class SrsRtmp {
} else if (frame.type == SrsCodecFlvTag.Audio && frame.avc_aac_type == 0) { } else if (frame.type == SrsCodecFlvTag.Audio && frame.avc_aac_type == 0) {
audioSequenceHeader = frame; audioSequenceHeader = frame;
} }
} catch (Exception e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Log.e(TAG, String.format("worker: send flv tag failed, e=%s", e.getMessage())); Log.e(TAG, String.format("worker: send flv tag failed, e=%s", e.getMessage()));
disconnect(); disconnect();
@ -317,7 +314,6 @@ public class SrsRtmp {
} }
}; };
flv.setHandler(handler); flv.setHandler(handler);
Looper.loop(); Looper.loop();
} }

Loading…
Cancel
Save