我制作了一款可以倒计时的应用。但它不起作用,它只是在textview中显示100。
这是我的代码:
public class MainActivity extends Activity {
private TextView textView;
private Button start;
Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
start = (Button) findViewById(R.id.button1);
start.setOnClickListener(onStart);
thread = new Thread( //it's my thread
new Runnable() {
@Override
public void run() {
for (int i = 99; i > 0; i--) {
Log.i("Where am I?", "I'm in for loop .");
try {
textView.setText(String.valueOf(i));
} catch (Exception e) {
Log.e("Exception.getCause", String.valueOf(e.getCause()), e.getCause());
}
Log.i("INDEX", String.valueOf(i));
}
}
});
}
private View.OnClickListener onStart = new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("Where am I?", "I in View.OnClickListener .");
thread.start();
}
};
}
答案 0 :(得分:3)
使用TextView
更新您的runOnUiThread
,如下所示......
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(String.valueOf(i));
}
});
<强>更新强>
如果计算延迟,您可以使用Handler
,如下所示。创建Handler
的对象并创建Thread
。
private Handler mTimerHandler = new Handler();
private Runnable mTimerExecutor = new Runnable() {
@Override
public void run() {
//add your code here which should execute after the specified delay
}
};
然后在postDelayed()
方法Handler
中传递该线程的时间应该延迟执行线程,如下所示...
mTimerHandler.postDelayed(mTimerExecutor, 1000);
如果要取消要执行的线程,请使用removeCallbacks()
方法,如下所示......
mTimerHandler.removeCallbacks(mTimerExecutor);
答案 1 :(得分:1)
在线程内捕获Exception
有点误导。事实上,textView.setText(String.valueOf(i));
执行的Thread
与UI Thread
不同,应该会导致CalledFromTheWrongThreadException
的应用崩溃。您应该使用Handler
在UI线程的上下文中执行该行
答案 2 :(得分:1)
textView.setText(String.valueOf(i));
只能在UI线程中使用。
答案 3 :(得分:1)
textView.setText(String.valueOf(i));
这是UI操作,您只能在主线程中处理UI操作。
您可以向活动句柄发送消息。
答案 4 :(得分:0)
您不能使用Thread类与UI进行交互,您应该使用AsyncTask或Handler类。 示例教程:http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html
答案 5 :(得分:0)