2017-05-10 107 views
-3

我有這樣的代碼在MainActivity:延遲崩潰的應用程序

boolean running = true; 
    @Override 
    public void onClick(View v) { 

     Button button = (Button)findViewById(R.id.start); 
     new Thread(new Runnable() { 
      public void run() { 
       int secs = 1; 
       while(running){ 
        Utils.delay(secs, new Utils.DelayCallback() { 
         int seconds = 0; 
         TextView licznik = (TextView)findViewById(R.id.licznik); 
         @Override 
         public void afterDelay() { 
          seconds = seconds + 1; 
          licznik.setText(Integer.toString(seconds)); 

         } 
        }); 


       } 
      } 
     }).start(); 


    } 

及其utils的類:

import android.os.Handler; 

public class Utils { 

    // Delay mechanism 

    public interface DelayCallback{ 
     void afterDelay(); 
    } 

    public static void delay(int secs, final DelayCallback delayCallback){ 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       delayCallback.afterDelay(); 
      } 
     }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds. 
    } 
} 

我發現StackOverflow上這個方法,但我按一下按鈕後崩潰我的應用程序 有什麼問題?請幫幫忙,我是否應該延遲做的另一種方法,告訴我這 錯誤:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
+1

把你的堆棧跟蹤這裏 –

+0

@LuizFernandoSalvaterra我這樣做是 – Teeracker

回答

0

你是在一個背景Thread已經不叫Looper.prepare()創建Handler,也觸摸UI組件關閉的主線程。

嘗試:

Handler handler = new Handler(Looper.getMainLooper()); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       delayCallback.afterDelay(); 
      } 
     }, secs * 1000); 

,看看是否能解決問題。無論哪種方式,不過,你可能會遇到問題,因爲while(running)呼叫會觸發大量的無眠......

+0

它的工作原理,但我不知道爲什麼呢,它把奇怪的數字設置爲「licznik」TextView。我想它是一個計數器 – Teeracker

+0

在Utils.delay調用後添加一個Thread.sleep(secs * 1000);呼叫,因爲它看起來像你試圖根據延遲增加。現在,while循環在秒之前發佈了噸可運行的代碼。 – Submersed

+0

它可能不會完全解決您的問題,但這超出了最初發布的問題的範圍,因爲還有其他的錯誤 - 例如設置「seconds = 0」並使用「secs」作爲延遲方法的參數。您可能只想查看類CountDownTimer。 https://developer.android.com/reference/android/os/CountDownTimer.html – Submersed