마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

토스트 메시지를 띄우고 싶은데 어디다가 넣어야 제가 원하는대로 띄워질지 모르겠네요

0 추천

while문 빠져나가서 score가 6이상이면 success 토스트 메시지 띄우고 싶은데 저렇게 넣어놓으면 avd가 닫히네요.. 중괄호 기준으로 토스트 코드를 여러 방법으로 옮겨봤는데 제가 원하는 바와는 달라서 ㅠㅠ 이렇게 글 남깁니다.

 

private class MyView extends View {
    public MyView(Context context) {
        super(context);
        new Thread() {
            @Override
            public void run() {
                super.run();
                while (score <= 5) {
                    SystemClock.sleep(2000);
                    invalidate();
                }
                Toast.makeText(getApplicationContext(), "success",Toast.LENGTH_LONG).show();
            }
        }.start();
    }
희망을기억해 (200 포인트) 님이 2022년 5월 28일 질문

1개의 답변

0 추천

앱이 크래시나는 이유는 화면 업데이트는 메인쓰레드에서만 가능한데, 님은 백그라운드 쓰레드에서 토스트를 띄우려고 했기 때문입니다. 토스트 띄우는 로직을 메인쓰레드에서 처리하도록 옮기세요.

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();
   });
}

 

spark (224,800 포인트) 님이 2022년 5월 28일 답변
...