为什么我的线程不起作用?

时间:2014-03-04 08:51:56

标签: java android multithreading

我制作了一款可以倒计时的应用。但它不起作用,它只是在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();
        }
    };
}

6 个答案:

答案 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));执行的ThreadUI 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)