앱이 크래시나는 이유는 화면 업데이트는 메인쓰레드에서만 가능한데, 님은 백그라운드 쓰레드에서 토스트를 띄우려고 했기 때문입니다. 토스트 띄우는 로직을 메인쓰레드에서 처리하도록 옮기세요.
MyView에 리스너를 하나 다세요.
private class MyView extends View {
interface Listener {
onScoreReached(int score);
}
private Listener listener;
public MyView(Context context) {
super(context);
new Thread() {
@Override
public void run() {
....
if (listener != null) listener.onScoreReachedI(score);
}
}.start();
}
public void setListener(Listener listener) {
this.listener = listener;
}
}
액티비티에서 리스너를 설정하세요. runOnUiThread는 코드블록을 메인쓰레드에서 실행하도록 합니다. 액티비티가 아니면 Handler 를 사용하시면 됩니다.
myView.setListener(score -> showSuccess(score) );
private void showSuccess(int score) {
runOnUiThread(() -> {
Toast.makeText(getApplicationContext(), "success",Toast.LENGTH_SHORT).show();
});
}