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.MediaRecorder;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.os.Looper;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@ -18,6 +17,8 @@ import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.util.List;
@ -37,7 +38,7 @@ public class MainActivity extends Activity implements SurfaceHolder.Callback, Ca
private byte[] mYuvFrameBuffer;
private SrsEncoder mEncoder;
private String mErrMsg;
// settings storage
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

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

Loading…
Cancel
Save