2012-04-22 3 views
3

, 탭 뷰를 사용하고 있습니다. 나는 이미 그것을 자신이나 그래서 제가 생각을 반복 핸들러를 중지하기 위해 handler.removeCallbacks(r);를 사용해보십시오stop handler.postDelayed 내 앱에서 tabview의 다른 탭으로 이동할 때

private final Runnable r = new Runnable() { 
    public void run() { 
     mVar = true; 
     while (mVar == true){ 
      calculateResult(); 
      //refresh(); 

      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    } 
}; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    handler.removeCallbacks(r); 
    setContentView(R.layout.result_view); 
    refresh(); 
    setBackGround(); 
} 
public void refresh() { 
    new Thread(r).start(); 
    //handler.postDelayed(r, 1000); 
} 

: 탭 중 하나 안에 내가 같은 새로 고침 기능을 구현합니다. 하지만 시스템을 시작할 때 충돌이 발생합니다.

04-23 01:14:20.234: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 53K, 47% free 2868K/5379K, external 0K/0K, paused 37ms 
04-23 01:14:20.265: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader [email protected] 
04-23 01:14:20.275: D/WindowManagerImpl(14753): addView, new view, mViews[0]: [email protected]0 
04-23 01:14:23.368: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 17K, 47% free 2901K/5379K, external 1151K/1663K, paused 23ms 
04-23 01:14:23.518: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 86K, 45% free 2960K/5379K, external 2320K/2875K, paused 24ms 
04-23 01:14:23.678: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 3K, 45% free 2961K/5379K, external 8073K/10082K, paused 25ms 
04-23 01:14:23.798: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader [email protected] 
04-23 01:14:23.878: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 10K, 45% free 2969K/5379K, external 13845K/15875K, paused 28ms 
04-23 01:14:23.898: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader [email protected] 
04-23 01:14:23.908: D/WindowManagerImpl(14753): addView, new view, mViews[1]: [email protected] 
04-23 01:14:24.108: W/dalvikvm(14753): threadid=10: thread exiting with uncaught exception (group=0x4001d5a0) 
04-23 01:14:24.108: E/AndroidRuntime(14753): FATAL EXCEPTION: Thread-11 
04-23 01:14:24.108: E/AndroidRuntime(14753): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.ViewRoot.checkThread(ViewRoot.java:3165) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.ViewRoot.requestLayout(ViewRoot.java:677) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.widget.ImageView.setImageDrawable(ImageView.java:330) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.widget.ImageView.setImageBitmap(ImageView.java:344) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.TouchImageView.setImageBitmap(TouchImageView.java:153) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.MapActivity.drawMap(MapActivity.java:163) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.MapActivity$1.run(MapActivity.java:31) 
04-23 01:14:24.108: E/AndroidRuntime(14753): at java.lang.Thread.run(Thread.java:1027) 
04-23 01:14:24.379: D/WindowManagerImpl(14753): finishRemoveViewLocked, mViews[0]: [email protected] 
04-23 01:14:24.419: D/WindowManagerImpl(14753): finishRemoveViewLocked, mViews[0]: [email protected] 
04-23 01:14:26.030: D/Process(14753): killProcess, pid=14753 

사람이 어떻게해야 말해 줄 수 : 여기

내 오류 로그입니까?

+0

로그를 게시 할 수 있습니까? – lrAndroid

+0

추가했습니다. 한번보세요. – Thomas

답변

1

나는 당신의 Runnable "r"이 removeCallbacks() 후에도 계속 실행되고 있다는 것을 짐작하고 있습니다. removeCallbacks()은 실행중인 Runnable을 멈추지 않으며 단지 시작하지 못하게합니다.

또한 refresh()은 "r"을 다시 호출하므로 무기한 호출됩니다. 따라서 "r"이 실행되는 동안 removeCallbacks()이 호출되면 "r"을 중지 할 코드가 없으며 영원히 반복됩니다.

해결 방법은 Runnable에 루프가 있고 각 루프 끝에 Thread.sleep()을 호출해야합니다. 그런 다음 루프를 종료하여 Runnable을 중지하십시오. 당신의 Runnable의 예를 들어

:

public void run() { 
    mVar = true; 
    while (mVar == true){ 
     //do stuff 
     Thread.sleep(2000); 
    } 

} 

MVAR 당신이 루프를 종료 false로 설정할 수 있습니다 정적 변수하자.

또한 UI 스레드에서이 Runnable을 실행하지 않는 것이 좋습니다. 이는 앱이 Thread.sleep(2000) 메서드 중에 응답을 중지 할 가능성이 있기 때문입니다.

new Thread(r).start(); 

편집 : 다음을 사용할 수 있습니다 당신은 UI 스레드에서 실행해야합니다 의견을 처리하여 Runnable를, 다음 코드보기를 취급하려는 경우. 그래서 runnable에서 뷰를 변경하는 모든 코드는 핸들러를 통해 호출되어야합니다.

+0

그래서, runnable을 멈추기 위해 어떻게해야합니까? – Thomas

+0

답변이 업데이트되었습니다. – lrAndroid

+0

미안하지만 나는 그 다음에 달리기 장소를 어디에서 알아야 할까? 다른 클래스에 있나요? 그러면 UI 안에 해당 클래스의 객체를 만듭니다. 그런 다음 새 스레드 (r) .start()를 사용하는 방법? 나는 조용한 새로운 안드로이드. 죄송합니다. – Thomas

0

나는 Handler를 사용하는 것이 Thread보다 나은 해결책이라고 생각합니다. 아래 코드를 참조하십시오. mVar가 제어 변수라고 가정합니다. 처리기를 중지하려면 false로 설정해야합니다.

private final Runnable r = new Runnable() { 
    public void run() { 
     if (mVar) { 
      calculateResult(); 
      handler.postDelayed(this, 2000); 
     } 
    } 
}; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    handler.removeCallbacks(r); 
    setContentView(R.layout.result_view); 
    refresh(); 
    setBackGround(); 
} 

public void refresh() { 
    handler.postDelayed(r, 1000); 
}