我正在尝试在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 :(得分: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);
}
});