Android开发中的多线程(3)

Java中的实现线程体方式3

  实现线程体方式3是实现线程体方式2的变种,本质上还是实现线程体方式2,但是在Android应用开发中经常采用第3种方式。下面我们看第3种方式的计时器代码清单.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TextThread3 extends Frame implements ActionListener {

private Button button;
    private Label label;
    private Thread clockThread;
    private int timer = 0;
    private boolean isRunning = true;

public TextThread3() {
        button = new Button("停止计时");
        label = new Label("计时器开始。。。");
        button.addActionListener(this);
        setLayout(new BorderLayout());
        add(button, "North");
        add(label, "Center");
        setSize(320, 480);
        setVisible(true);

clockThread = new Thread(new Runnable() {

@Override
            public void run() {
                while (isRunning) {
                    try {
                        Thread.currentThread().sleep(1000);
                        timer ++;
                        label.setText("逝去了:"+timer);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        clockThread.start();
        isRunning = true;
    }

@Override
    public void actionPerformed(ActionEvent e) {
        isRunning = false;
    }

/**
    * @param args
    */
    public static void main(String[] args) {
        TextThread3 thread3 = new TextThread3();
    }
}

与第2种方式比较,我们发现Frame类不再实现Runnable接口了,而是在实例化Thread类的时候,定义了一个实现Runnable接口的匿名内部类:

clockThread = new Thread(new Runnable() {

@Override
            public void run() {
                while (isRunning) {
                    try {
                        Thread.currentThread().sleep(1000);
                        timer ++;
                        label.setText("逝去了:"+timer);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

有关Java多线程的内容还有很多,例如线程优先级、线程同步等,由于这些内容与本书关系不是很紧密,所以不再介绍了,有关其他的线程知识可以参考Java方面的书籍。接下来介绍一下Android中的线程。

Android中的线程

  在Android平台中多线程应用很广泛,在UI更新、游戏开发和耗时处理(网络通信等)等方面都需要多线程。Android线程涉及的技术有:Handler;Message;MessageQueue;Looper;HandlerThread。

  Android线程应用中的问题与分析

  为了介绍这些概念,我们把计时器的案例移植到Android系统上,按照在Frame方式修改之后的代码清单.

package com.example.testthread4;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.*;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

private Button mButton;
    private TextView mTextView;
    private boolean isRunning = true;
    private Thread mThread;
    private int timer = 0;
    //private Handler handler;

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

mButton = (Button) findViewById(R.id.button1);
        mTextView = (TextView) findViewById(R.id.textView1);

mButton.setOnClickListener(new OnClickListener() {

@Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                isRunning = false;
            }
        });
        /*handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case 0:
                    mTextView.setText("逝去了:" + msg.obj);
                }
            }
        };*/
        mThread = new Thread(new Runnable() {

@Override
            public void run() {
                try {
                    while (isRunning) {
                        Thread.currentThread().sleep(1000);
                        timer++;
                        /*Message message = new Message();
                        message.obj = timer;
                        message.what = 0;
                        handler.sendMessage(message);*/
                        mTextView.setText("逝去了:"+timer);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

}
        });
        mThread.start();
    }
}

程序打包运行结果出现了异常,如图所示。

Android开发中的多线程

我们打开LogCat窗口,出错日志信息如图所示。

Android开发中的多线程

系统抛出的异常信息是“Only the original thread that created a view hierarchy can touch its views”,在Android中更新UI处理必须由创建它的线程更新,而不能在其他线程中更新。上面的错误原因就在于此。  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f1baa8899bd94a6d182a2f2be75f728e.html