public class MyTask implements Runnable {
public void run() {
//execute your task
}
}
//...
public static void main(){
new Thread(new MyTask()).start();
}
public class Task1 implements Runnable {
public void run() {
//蛋餅*1000 豆漿*1000
}
}
public class Task2 implements Runnable {
public void run() {
//饅頭*1 豆漿*1
}
}
//歐巴桑去隔壁買惹...
int mVar = 0;
public class Task1 implements Runnable{
public void run(){
mVar++;
}
}
public class Task1 implements Runnable{
public void run(){
mVar--;
}
}
popo
pipi
paper?
toilet?
class A{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
class B{
private A a;
public B(A a){
this.a = a;
}
}
class A{
private C c;
public A(C c){
this.c = c;
}
}
class B{
private C c;
public B(C c){
this.c = c;
}
}
new Thread(new Runnable() {
public void run() {
//這邊是背景thread在運作, 這邊可以處理比較長時間或大量的運算
((Activity) mContext).runOnUiThread(new Runnable() {
public void run() {
//這邊是呼叫main thread handler幫我們處理UI部分
}
});
}
}).start();
new Handler(mContext.getMainLooper()).post(new Runnable(){
public void run(){
//處理少量資訊或UI
}
});
view.post(new Runnable(){
public void run(){
//更新畫面
}
});
Runnable
Handler
Handler
Message Queue
Message
Message
Message
Looper
UI Thread
Runnable
new Thread(new Runnable() {
public void run() {
Log.e(TAG, "A");
Looper.prepare();
new Handler().post(new Runnable(){
@Override
public void run() {
Log.e(TAG, "B1");
}
});
new Handler().post(new Runnable(){
@Override
public void run() {
Log.e(TAG, "B2");
Looper.myLooper().quit();
}
});
Looper.loop();
Log.e(TAG, "C");
((Activity) mContext).runOnUiThread(new Runnable() {
public void run() {
Log.e(TAG, "D");
}
});
}
}).start();
輸出為:
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler mHandler = new Hanlder(handlerThread.getLooper()){
public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case 1:
Logger.e("message receive");
break;
}
}
}
handler.sendEmptyMessage(1);
//或者
new Hanlder(handlerThread.getLooper())
.post(new Runnable(){
public void run(){
//長時間任務1
//長時間任務2
}
});
new Thread(new Runnable(){
@Override
public void run(){
//Task 1
runOnUiThread(new Runnable(){
@Override
public void run(){
//update ui
new Thread(new Runnable(){
@Override
public void run(){
//Task 2
runOnUiThread(new Runnable(){
@Override
public void run(){
//update ui
}
});
}
}).start();
}
});
}
}).start();
HandlerThread mHandlerThread = new HandlerThread("my handler thread");
mHandlerThread.start();
Handler mHandler = new Handler(mHandlerThread.getLooper());
mHandler.post(task1);
// ... n-1 task
mHandler.post(taskN);
(OS: 你的需求我們都聽到了)
ThreadPoolExecutor executor = new ThreadPoolExecutor(
int corePoolSize,
int maxPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue
);
public Bitmap getRemoteBmp(String url){
final Data result = fetchData(url);
byte[] image = downloadAvatar(data.getUrl());
Bitmap bmp = decodeImg(img);
//to do something
return bmp;
}
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Object> future = executor.submit(new Callable<Object>(){
public Object call() throws Exception{
Object obj = doLongTask();
return obj;
}
});
Object result = future.get();
class MyTask extends AsyncTask<Params, Progress, Result>{
protected void onPreExecute(){
// in main thread
}
protected Result doInBackground(Params... params){
// in background thread
}
protected void onProgressUpdate(Progress... progress){
// in main thread
}
protected void onPostExecute(Result result){
// in main thread
}
protected void onCancelled(Result result){
// in main thread
}
}
API Level | execute | executeOnExecutor |
---|---|---|
1-3 | 循序 | 無 |
4-10 | 並行 | 無 |
11-12 | 並行 | 循序/並行(可自訂) |
13+ | 循序 | 循序/並行(可自訂) |
//循序
executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, Object... objs);
//並行
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object... objs);
//自訂
executeOnExecutor(CustomExecutor, Object... objs);
public class ServiceDemo extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
private LoaclServiceConnection mLoaclServiceConnection = new LoaclServiceConnection();
public class ServiceDemo extends Service {
private MyBinder mBinder = new MyBinder();
private class MyBinder extends Binder{
public ServiceDemo getService(){
return ServiceDemo.this;
}
}
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
private class LoaclServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//透過Binder調用Service內的方法
}
@Override
public void onServiceDisconnected(ComponentName name) {
//service 物件設為null
}
}
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
bindService(new Intent(this, ServiceDemo.class),
mLoaclServiceConnection, Context.BIND_AUTO_CREATE);
}
}
public class IntentServiceDemo extends IntentService {
public IntentServiceDemo(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
//背景執行緒
}
}
執行緒安全 | 平行處理 | 可與UI溝通 | |
---|---|---|---|
Thread | no | yes | no |
HandlerThread | yes | no | no |
Thread Pool | no | yes | no |
AsyncTask | no | yes | yes |
Service | no | yes | no |
IntentService | yes | no | no |
AIDL(Android介面定義語言): 當行程想開放功能性給其他行程時, 可透過AIDL來進行定義, 編譯後會產生支援行程間溝通(IPC, Interprocess communication)的java檔案。
interface IMyAidlInterface {
String getThreadName();
}
private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){
@Override
public String getThreadName() throws RemoteException {
return MyActivity.class.getName();
}
};
try {
IMyAidlInterface mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(binder);
String threadName = mIMyAidlInterface.getThreadName();
} catch (RemoteException e) {
e.printStackTrace();
}
import personal.givemepass.myapplication.IMyAidlInterfaceCallback;
interface IMyAidlInterface {
oneway void getThreadName(IMyAidlInterfaceCallback callback);
}
private final IMyAidlInterface.Stub server = new IMyAidlInterface.Stub(){
@Override
public void getThreadName(IMyAidlInterfaceCallback callback) throws RemoteException {
String name = "aaa";
callback.handleMessage(name);
}
};
interface IMyAidlInterfaceCallback {
void handleMessage(String name);
}
private IMyAidlInterfaceCallback.Stub mClient = new IMyAidlInterfaceCallback.Stub(){
@Override
public void handleMessage(String name) throws RemoteException {
//client 接收
}
};