首页 > 代码库 > Android中的多线程编程(一)附源代码

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

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,提高程序执行速率的。

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

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