2012-01-03 163 views
1

所以我環顧四周,看到了類似的東西,但他們都與地理位置的東西,我試圖做的是一個簡單的計時器的幾個職位。基本上我使用TimerTask作爲一個活動類中30秒的倒計時。每次調用TimerTask時,應用程序都會崩潰。出於上下文的目的,這是來自使用startActivityForResult調用來調用它的父項的子活動。Android的TimerTask崩潰程序致命的異常時間-0

public class NewLevelActivity extends Activity { 

    int time = 30; 
    int level = 1; 
    TextView text; 
    TimerTask task; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.new_level); 
     text = (TextView) findViewById(R.id.newLevelText); 
     level = WholettheballoutActivity.level; 


     task = new TimerTask() { 
     public void run() { 
        time--; 
        //text.setText("Level " + Integer.toString(level)+ " will start in " +Integer.toString(time) + " seceonds."); 
        new Timer().schedule(task,1000); 
       } 
     }; 

     new Timer().schedule(task,1000); 

    } 


    @Override 
    protected void onPause() { 
     super.onPause(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 




} 

的logcat中顯示了這種

01-03 01:08:57.630: ERROR/AndroidRuntime(19618): FATAL EXCEPTION: Timer-0 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.ViewRoot.checkThread(ViewRoot.java:3441) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.ViewRoot.requestLayout(ViewRoot.java:586) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.View.requestLayout(View.java:10781) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.View.requestLayout(View.java:10781) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.View.requestLayout(View.java:10781) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.View.requestLayout(View.java:10781) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.view.View.requestLayout(View.java:10781) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.widget.TextView.checkForRelayout(TextView.java:6052) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.widget.TextView.setText(TextView.java:2826) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.widget.TextView.setText(TextView.java:2691) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at android.widget.TextView.setText(TextView.java:2666) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at org.kizik.WLTBO.NewLevelActivity$1.run(NewLevelActivity.java:43) 
01-03 01:08:57.630: ERROR/AndroidRuntime(19618):  at java.util.Timer$TimerImpl.run(Timer.java:284) 

我走上與嘗試設置視圖的文本的問題,但事實並非如此,因爲註釋掉集文字部分之後仍然是錯誤的

+0

我會嘗試做一個乾淨的版本,並確保它下載好。我無法統計我認爲Eclipse下載apk到我的設備的次數,並且我正在運行舊代碼... – nmjohn 2012-01-03 07:34:22

回答

2

您嘗試更新從非UI線程的UI,所以這樣做,你需要把你的東西,更新內部runOnUiThread()

Activity_name.this.runOnUiThread(new Runnable() { 
    public void run() { 
     text.setText("Level " + Integer.toString(level)+ " will start in " +Integer.toString(time) + " seceonds."); 
    } 
}); 
+0

現在我在哪裏放置此代碼,以及如何使用該代碼製作計數器。該程序似乎崩潰並重新啓動,每次我打電話給TimerTask – 2012-01-05 00:09:01

+0

好吧,這確實解決了用戶界面問題。爲了使這一切工作,我找出了TimerTask中的新計時器,並將其設置爲sheduleAtFixedRate,並且工作正常。 – 2012-01-05 00:14:34

+0

這就是爲什麼我討厭'定時器'使用'處理程序'他們是更有用的Android的一部分。 – 2013-01-29 18:18:51

0
public class NewLevelActivity extends Activity { 

int time = 30; 
int level = 1; 
TextView text; 
TimerTask task; 




@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.new_level); 
     text = (TextView) findViewById(R.id.newLevelText); 
     level = WholettheballoutActivity.level; 


     task = new TimerTask() { 
     public void run() { 
        time--; 
        textChangeHandler.sendEmptyMessage(0); 
        new Timer().schedule(task,1000); 
       } 
     }; 

     new Timer().schedule(task,1000); 

    } 


    @Override 
    protected void onPause() { 
     super.onPause(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    private Handler textChangeHandler=new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
        text.setText("Level " + Integer.toString(level)+ " will start in " +Integer.toString(time) + " seceonds."); 
     } 
    }; 


} 

你不能從thread..you修改UI可以與處理器的幫助下做

0

yourTaskObj.cancel()當你的任務就完成了..例如UI。 task.cancel();