Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android Framework系列之IPC(一)

Android Framework系列之IPC(一)

編輯:初級開發

文章分類:移動開發 說到Android的IPC(Inter-Process Conmmunication)首先想到的就是Handler和Looper,Handler用於多進程之間的通信和數據交換,將各進程之間通信的數據Message放置到Message Queue裡,而Looper用於創建各進程自身的message queue,然後在適當的時候分發給相應的進程。  我們知道在Android中,每一個UI線程是一個主線程(Main Thread),android為每一個主線程維護一個Message Queue,當用戶需要長時間的背景線程操作的時候,需要create自己的new thread,這樣的new thread是沒有自己的message queue的,只能共享主線程的message queue並且將所做的運算結果和數據通過Handler發送到主線程的message queue裡,被主線程共享。 
XML代碼  
<?XML version="1.0" encoding="utf-8"?>  
<LinearLayout XMLns:android="http://schemas.android.com/apk/res/android"  
    android:orIEntation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >       <ProgressBar   
        android:id="@+id/ProgressBar01"   
        android:layout_width="150dip"  
        android:layout_height="wrap_content"  
        style="?android:attr/progressBarStyleHorizontal">  
    </ProgressBar>   </LinearLayout>  
這個XML文件創建了一個progressbar,並且將style設置成水平, 
style="?android:attr/progressBarStyleHorizontal  XML代碼  
<?XML version="1.0" encoding="utf-8"?>  
<manifest XMLns:android="http://schemas.android.com/apk/res/android"  
      package="waterlife.ipc.demo"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".IPCConmunication"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>       </application>  
    <uses-permission android:name="android.permission.INTERNET" />   </manifest>   
為了訪問網絡,需要在manifest file裡設置Access internet的permission, 
    <uses-permission android:name="android.permission.INTERNET" />  Java代碼  
package waterlife.ipc.demo;   import Java.io.InputStream;  
import Java.Net.MalformedURLException;  
import Java.Net.URL;  
import Java.Net.URLConnection;  
import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.HandlerThread;  
import android.os.Looper;  
import android.os.Message;  
import android.widget.ProgressBar;     
public class IPCConmunication extends Activity {  
    static ProgressBar pb;  
    final int UPDATE_PROGRESS_BAR = 1000;       @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentVIEw(R.layout.main);  
        pb = (ProgressBar)findVIEwById(R.id.ProgressBar01);  
        Download dl = new Download();  
        new Thread(dl).start();       }     
    Handler mHandle = new Handler()          public void handleMessage(Message msg)               switch(msg.what)                   case UPDATE_PROGRESS_BAR:  
                    pb.setProgress(msg.arg1);  
                    break;  
                default:  
                    break;           }     
    class Download implements Runnable     
        @Override  
        public void run() {  
            int totalSize = 0;  
            InputStream recevIEr = null;                try {  
                URL myUrl = new URL("http://bbs.nju.edu.cn");                   URLConnection urlConn = myUrl.openConnection();  
                totalSize = urlConn.getContentLength();  
                recevIEr = urlConn.getInputStream();  
                byte[] b =new byte[256];  
                int length = 0;  
                length += recevIEr.read(b);  
                while(length < totalSize)                       Message msg = mHandle.obtainMessage(UPDATE_PROGRESS_BAR);  
                    msg.arg1 = (int)(length*100/totalSize);  
                    if(mHandle.hasMessages(UPDATE_PROGRESS_BAR))                           mHandle.removeMessages(UPDATE_PROGRESS_BAR);                       mHandle.sendMessage(msg);  
                    length += recevIEr.read(b);  
                    Thread.sleep(1000);  //睡眠1S,這個方法是不值得推薦的,因為它會使線程獨占CPU,在以後的例子會使用更加有效的方法                   recevIEr.close();  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }catch (Exception ex)                   ex.printStackTrace();           }   }   我們create出來的一個new thread,用這個線程去網絡上下載數據包,並且把下載的進度更新到UI主線程的progressbar上。兩個線程之間的通信是用Handler來傳遞的。在這裡新的線程Download和UI main thread共用message queue。  當然,我們可以為自己新建的線程設置自身的message queue,方法如下: 
Java代碼  
package waterlife.ipc.demo;   import Java.io.InputStream;  
import Java.Net.MalformedURLException;  
import Java.Net.URL;  
import Java.Net.URLConnection;  
import android.app.Activity;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.HandlerThread;  
import android.os.Looper;  
import android.os.Message;  
import android.widget.ProgressBar;     
public class IPCConmunication extends Activity {  
    static ProgressBar pb;  
    final int UPDATE_PROGRESS_BAR = 1000;       @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentVIEw(R.layout.main);  
        pb = (ProgressBar)findVIEwById(R.id.ProgressBar01);  
        Download dl = new Download();  
        new Thread(dl).start();       }     
    class Download implements Runnable     
        @Override  
        public void run() {  
            int totalSize = 0;  
            InputStream recevIEr = null;               HandlerThread threadLoop = new HandlerThread("Download");  
            threadLoop.start();  
            Looper mLooper = threadLoop.getLooper();  
            Handler mHandle = new Handler(mLooper)                   public void handleMessage(Message msg)                       switch(msg.what)                           case UPDATE_PROGRESS_BAR:  
                            pb.setProgress(msg.arg1);  
                            break;  
                        default:  
                            break;                   }      
            try {  
                URL myUrl = new URL("http://bbs.nju.edu.cn");                   URLConnection urlConn = myUrl.openConnection();  
                totalSize = urlConn.getContentLength();  
                recevIEr = urlConn.getInputStream();  
                byte[] b =new byte[256];  
                int length = 0;  
                length += recevIEr.read(b);  
                while(length < totalSize)                       Message msg = mHandle.obtainMessage(UPDATE_PROGRESS_BAR);  
                    msg.arg1 = (int)(length*100/totalSize);  
                    if(mHandle.hasMessages(UPDATE_PROGRESS_BAR))                           mHandle.removeMessages(UPDATE_PROGRESS_BAR);                       mHandle.sendMessage(msg);  
                    length += recevIEr.read(b);  
                    Thread.sleep(1000);                   recevIEr.close();  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }catch (Exception ex)                   ex.printStackTrace();           }   }   HandlerThread是一個專門用於新建Looper的線程類,它實現了Looper.prepare()和Looper.loop()的方法。HandlerThread ceate一個新的Looper並且綁定到新線程的Handler上,實現了對新線程創建自己的Message queue的目的。 
轉載自:http://ictch.iteye.com/blog/1007179
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved