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,提高程式運行速率的!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。