Android中的多线程编程(一)附源码

来源:互联网 发布:mac pro 风扇声音很大 编辑:程序博客网 时间:2024/06/05 16:44

Android中多线程编程:Handler类、Runnable类、Thread类之概念分析

1.Handler类:

Handler是谷歌封装的一种机制:可以用来更新UI以及消息的发送和处理。Handler是运行在主线程(UI线程)。

(2).使用Handler机制的原因:

这是谷歌封装的一种更新UI机制和消息机制,如果不使用这个来更新UI和发送处理消息的时候就会抛出异常。

(3).Handler的使用:

Handler发送消息其实是发送给自己。也就是说由自己来进行发送和处理。是因为Handler内部和Looper相关联。
A.更新UI界面方面:

package com.chengdong.su.handlerdemo;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.os.Build;/** * Handler用途1:更新UI界面中的组件 *  * @author scd *  */public class MainActivity extends Activity {    private ImageView mView;    /** 数据源 */    private int[] mImage = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3 };    /** 图片所在的位置 */    private int mIndex = 0;    /** the object of the Handler */    private Handler mHandler = new Handler();    /** the object of the Runnable */    private MyRunnable mRunnable = new MyRunnable();    Runnable runnable = new Runnable() {        @Override        public void run() {            mIndex++;            mIndex = mIndex % 3;            mView.setImageResource(mImage[mIndex]);            // 再次调用Runnable对象,每隔一秒钟调用一次run()方法            mHandler.postDelayed(runnable, 1000);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_main);        init();        // 方法一:        // mHandler.postDelayed(runnable, 1000);        // 方法二:自定义Runnable对象        mHandler.postDelayed(mRunnable, 1000);    }    /***     * init the view     */    private void init() {        mView = (ImageView) findViewById(R.id.imageView1);    }    /**     * 任务:业务逻辑     *      * @author scd     *      */    private class MyRunnable implements Runnable {        @Override        public void run() {            mIndex++;            mIndex = mIndex % 3;            mView.setImageResource(mImage[mIndex]);            // 再次调用Runnable对象,每隔一秒钟调用一次run()方法            mHandler.postDelayed(mRunnable, 1000);        }    }}

B.消息处理方面:

package com.chengdong.su.handlerdemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.widget.ImageView;/** * Handler用途1:更新UI界面中的组件 *  * @author scd *  */public class MainActivity extends Activity {    private String TAG = "MainActivity";    private boolean Flag;    private ImageView mView;    /** the object of the Handler */    private Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case 0: {                mView.setImageResource(R.drawable.ic_1);                Log.d(TAG, "消息1");                break;            }            case 1: {                mView.setImageResource(R.drawable.ic_2);                Log.d(TAG, "消息2");                break;            }            default:                break;            }        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_main);        init();        if (Flag) {            mHandler.sendEmptyMessage(0);        } else {            mHandler.sendEmptyMessage(1);        }    }    /***     * init the view     */    private void init() {        mView = (ImageView) findViewById(R.id.imageView1);    }}

2.Runnable类:

Runnable类是在UI线程中运行的,并没有创建新的线程。Runnable类是一个接口,通过覆写该类中的run()方法来实现业务逻辑需求。来更新UI界面中的组件。Runnable类只是一个任务接口。是开启的线程的执行的任务。

3.Thread类:

实现Runnable类中的run()方法,Thread类调用该run()方法来运行新开启的线程,线程需要执行的内容都在该run()方法中来完成。

(1).start()方法:该方法启动一个线程。但是此线程是处于就绪状态,并没有运行。然后通过Thread系统类自动调用run()方法来完成运行操作。

(2).run()方法:该方法成为线程体。包含了要执行的线程的内容。run()方法运行结束,此线程终止。

package com.chengdong.su.handlerdemo;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import android.os.Build;/** *  * @author scd *  */public class SecondActivity extends Activity {    private String TAG = getClass().getSimpleName();    private TextView mView;    private MyThread mThread;    private Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            Log.d(TAG, "Thread UI:" + Thread.currentThread().getId());            mView.setText("111");        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        System.out.println("--->UI线程:" + Thread.currentThread().getId());        // 方法一:        new Thread() {            public void run() {                System.out                        .println("--->新的线程:" + Thread.currentThread().getId());            };        }.start();        // 方法二:        new Thread(new Runnable() {            @Override            public void run() {                System.out                        .println("--->新的线程:" + Thread.currentThread().getId());            }        }).start();    }    private void init() {        mView = (TextView) findViewById(R.id.textView1);    }    class MyThread extends Thread {        public Handler mHandler2;        @Override        public void run() {            // 创建一个消息载体对象            Looper.prepare();            mHandler2 = new Handler() {                public void handleMessage(android.os.Message msg) {                    Toast.makeText(getApplicationContext(), "111", 1).show();                };            };            // 循环机制            Looper.loop();        }    }}

总结:
Runnable()只是一个任务的抽象,并不是多线程。Thread.start()才是新开一个多线程。并且在新开的线程执行Thread,执行run()方法。多线程是Thread实现,跟Runnable没有太大关系。线程就是为了更好地利用CPU,提高程序运行速率的!

2 0
原创粉丝点击