自定义秒表应用程序android

时间:2012-10-22 04:14:08

标签: android android-layout timer

我正在尝试在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>

出了什么问题?
还有其他方法可以开发秒表吗?

2 个答案:

答案 0 :(得分: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);
        }
    });
}

答案 1 :(得分:1)

您无法修改子线程中的view / setText。只能从UI线程/主线程中访问视图。

从子线程

中尝试这个
 runOnUiThread(new Runnable() {          
    @Override         
    public void run() {             
       count_increment(v);  
    }     
});