2010-12-11 10 views
0

onTouchEvent 메소드와 함께 다음 스플래시 화면 코드를 사용하고 있습니다. 나는 ANR을 얻고 있으며 무엇을해야할지 모른다. 응용 프로그램은 완벽하게 작동하지만 가끔 미안, 활동 xxx가 응답하지 않는 경우가 있습니다. 어떤 아이디어?ANR을 유발하는 Android 스플래시 화면

_splashTime = 5000 ; // approx 5 seconds 
    public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     _active = false; 
    } 
    return true; 
    } 

    Thread splashTread = new Thread() { 
    @Override 
    public void run() { 
    try { 
     int waited = 0; 
     while(_active && (waited < _splashTime)) 
     { 
      sleep(_waitsecs); 
      if (_active) { 
       waited += _waitsecs ; 
      } 
     } 
    } 
    catch(InterruptedException e) { 
     // do nothing with catch 
    } 
    finally { 
     start_program(); 
     finish(); 
    } 
} 
}; 
splashTread.start(); 
+0

왜 스플래시 화면을 5 초 표시 하시겠습니까? 그가 뭔가를 할 수 있기 전에 사용자가 5 초마다 기다리는 것은 성가시다. –

답변

2

활동이 응답하지 않는 것은 활동이 5 초 이내에 작업을 완료하지 않을 때 발생합니다. 이것이 때로는 때때로 오는 이유이기도합니다. ANR 문제에 대해서는 http://developer.android.com/guide/practices/design/responsiveness.html을보아야합니다.

그러나 일반적으로 UI에서 대기중인 스레드를 시작하면 안됩니다. 기본 솔루션은 대기 태스크 또는 백그라운드 태스크에 대한 서비스에 알람을 사용하는 것입니다. 또 다른 가능한 해결책 앱의 모든 초기화를 수행하는 백그라운드 서비스를 시작하는 것입니다 Android: How to use AlarmManager

:

알람의 짧은 예에서 찾을 수 있습니다. 끝나면 스플래시 화면이 닫힙니다.

2

이것은 타이머 기반 작업을위한 매우 간단한 솔루션입니다. 통과해라.

TimerTask timerTask; 
    Timer timer; 

    timerTask = new TimerTask() { 

     @Override 
     public void run() { 
      // after 3 seconds this statement excecutes 
      // write code here to move to next screen or 
      // do next processing. 
     } 
    }; 

    timer = new Timer(); 
    timer.schedule(timerTask, 3 * 1000); // 3 seconds 

올바른 방법으로 사용하면 ANR이 생성되지 않습니다.

- 고마워요