2012-10-22 19 views
4

我試圖開發的Android定製的秒錶應用,但它拋出以下異常:定製的秒錶應用軟件Android

android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次原來的線程可以觸摸其觀點。

我也嘗試過使用計時器,但是當我們使用它的停止方法時,它會從其先前的值開始。

以下是我的活動文件

public class MainActivity extends Activity implements OnClickListener 
{ 

TextView sec,milisec,min; 
Button start,stop,pause,resume; 
int count=0; 
Chronometer chrono; 
Timer timer; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    chrono=(Chronometer)findViewById(R.id.chronometer); 
    milisec=(TextView)findViewById(R.id.milisec); 
    sec=(TextView)findViewById(R.id.sec); 
    min=(TextView)findViewById(R.id.min); 
    start=(Button)findViewById(R.id.start); 
    stop=(Button)findViewById(R.id.stop); 
    pause=(Button)findViewById(R.id.pause); 
    resume=(Button)findViewById(R.id.resume); 


    System.out.println("-------1-------"); 

    start.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      //chrono.start(); 

     //count=Integer.parseInt(count_view.getText().toString());*/ 
     timer = new Timer(); 
     timer.schedule(new TimerTask() 
     { 
      public void run() 
      { 
       System.out.println("-------2-------"); 
       View v = new View(getApplicationContext()); 
       count_increment(v); 
      } 
      },1000,10000); 

    } 

    }); 

    stop.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      //chrono.clearComposingText(); 
      //chrono.setText("00"); 
      timer.cancel(); 

     } 
    }); 
} 

public void count_increment(View v) 
{ 
    count++; 
    System.out.println("count="+count); 
    //count_str=String.valueOf(count); 
    milisec.setText(""+count); 

} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

} 



} 

和下面是XML文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="30dp" 
    android:gravity="center_horizontal" > 

    <TextView 
     android:id="@+id/min" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="00" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text=":" /> 

    <TextView 
     android:id="@+id/sec" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="00" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text=":" /> 

    <TextView 
     android:id="@+id/milisec" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="00" /> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="60dp" 
    android:gravity="center_horizontal" > 

    <TableLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" > 

     <TableRow 
      android:id="@+id/tableRow1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 

      <Button 
       android:id="@+id/start" 
       android:layout_width="80dp" 
       android:layout_height="wrap_content" 
       android:text="Start" /> 

      <Button 
       android:id="@+id/stop" 
       android:layout_width="80dp" 
       android:layout_height="wrap_content" 
       android:text="Stop" /> 

      <Button 
       android:id="@+id/pause" 
       android:layout_width="80dp" 
       android:layout_height="wrap_content" 
       android:text="Pause" /> 

      <Button 
       android:id="@+id/resume" 
       android:layout_width="80dp" 
       android:layout_height="wrap_content" 
       android:text="Resume" /> 
     </TableRow> 

     <TableRow 
      android:id="@+id/tableRow1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 

      <Chronometer 
       android:id="@+id/chronometer" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Chronometer" /> 

     </TableRow> 
    </TableLayout> 
</LinearLayout> 

</RelativeLayout> 

到底哪裏出問題了?
是否有任何其他的方式比這個發展秒錶?

+0

早晨很好試試這個......有一個愉快的一天... N如何[Rü –

+0

凱BOL吶......凱..? –

+0

鈦天生nalayak aahe ... AATA nalayak帕納dakhavte aahe evdhech ... –

回答

1

的錯誤信息是相當自我解釋說:那就不應該在一個新的線程直接觸摸UI元素。可能的解決方法是,您發佈可運行到UI線程通過Activity.runOnUiThread()

我的意思是這樣的(僞代碼未測試)來更新UI:

public void count_increment(View v) 
{ 
    count++; 
    System.out.println("count="+count); 
    //count_str=String.valueOf(count); 
    // milisec.setText(""+count); 
    final String str = ""+count; 
    runOnUiThread(new Runnable() { 
     public void run() { 
      milisec.setText(str); 
     } 
    }); 
} 
+0

謝謝,但我不知道在哪裏做出改變。能否請您與code.please –

+0

我曾與一些代碼來說明這個想法更新的答案解釋。 –

1

你不能修改視圖/的setText一個子線程。視圖只能從UI線程/主線程中訪問。

從子線程內

runOnUiThread(new Runnable() {   
    @Override   
    public void run() {    
     count_increment(v); 
    }  
});