編輯:Android開發實例
說到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 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 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" />
- 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;
- /** Called when the activity is first created. */
- @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,方法如下:
- 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;
- /** Called when the activity is first created. */
- @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的目的。
對於很多初學者或者剛工作的Android新手來說,我們的項目經驗還停留在做demo的階段,有沒有一種很low的感覺,並且當你真正上手做大項目的時候又
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
本文為大家演示了如何使用Chronometer控件實現Android計時器的實
最近寫了一個簡單的朋友圈程序,包含了朋友圈的列表實現,視頻的錄制、預覽與上傳,圖片可選擇拍照或者從相冊選取,從相冊選取可以一次選擇多張照片,並且限制照片的張數,想擁有真正