Android中的多線程編程(一)附源碼,android多線程編程

來源:互聯網
上載者:User

Android中的多線程編程(一)附源碼,android多線程編程

Android中多線程編程:Handler類、Runnable類、Thread類之概念分析

1.Handler類:

Handler是Google封裝的一種機制:可以用來更新UI以及訊息的發送和處理。Handler是運行在主線程(UI線程)。

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

這是Google封裝的一種更新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,提高程式運行速率的!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.