安卓之多线程

来源:互联网 发布:招淘宝客服是做什么的 编辑:程序博客网 时间:2024/05/16 10:12

一:基本用法:
①继承Thread

定义线程

class MyThread extends Thread {    @Override    public void run() {        // 处理具体的逻辑    }}

执行

new MyThread().start();

②实现 Runnable 接口

定义线程

class MyThread implements Runnable {@Overridepublic void run() {// 处理具体的逻辑}

执行

MyThread myThread = new MyThread();new Thread(myThread).start();

③匿名类

new Thread(new Runnable() {@Overridepublic void run() {// 处理具体的逻辑}}).start();

二:子线程中更新UI

Android的UI也是线程不安全的。如果想要更新应用程序里的 UI元素,则必须在主线程中进行,否则就会出现异常。
例子:

public class MainActivity extends Activity implements OnClickListener {    private TextView text;    private Button changeText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView) findViewById(R.id.text);        changeText = (Button) findViewById(R.id.change_text);        changeText.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.change_text:            new Thread(new Runnable() {                @Override                public void run() {                    text.setText("Nice to meet you");                }            }).start();            break;        default:            break;        }    }}

上面代码是在子线程更新UI,会报错。下面是正确的写法,注意对比:

public class MainActivity extends Activity implements OnClickListener {    public static final int UPDATE_TEXT = 1;    private TextView text;    private Button changeText;    private Handler handler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {            case UPDATE_TEXT:                // 在这里可以进行UI 操作                text.setText("Nice to meet you");                break;            default:                break;            }        }    };........    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.change_text:            new Thread(new Runnable() {                @Override                public void run() {                    Message message = new Message();                    message.what = UPDATE_TEXT;                    handler.sendMessage(message); // 将Message 对象发送出去                }            }).start();            break;        default:            break;        }    }}
上面这个方法被称为Android 异步消息处理,使用这种机制就可以出色地解决掉在子线程中更新 UI 的问题了。 其实,我们在子线程中对 UI进行操作,Android 还提供了另外一些好用的工具,AsyncTask 就是其中之一,很常用,一个常见例子就是在下载时更新UI显示下载进度。还有一个小问题:toast因为也是更新UI,所以也是不能直接放在子线程中的。
0 0