日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android service使用handle,android中对Looper、HandlerThread、IntentService的理解及使用方法...

發布時間:2025/3/21 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android service使用handle,android中对Looper、HandlerThread、IntentService的理解及使用方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

消息隊列處理模型

容器保存事件,隊列

涉及到角色:

類 功能

MessageQueue 存放消息

Looper 輪循消息隊列,從中取出消息

Thread 處理消息

Message 消息

Handler 在其他線程發消息給當前線程

1.looper的例子及說明

由Looper決定

Looper對象在哪個線程創建,

Handler的handleMessage方法就在哪個線程執行public class MainActivity extends Activity

{

private Handler mHandler;

int what = 0;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

mHandler.sendEmptyMessage(what ++);//主線程發送

new Thread("aaa")

{

public void run()

{

mHandler.sendEmptyMessage(what ++);//“aaa”子線程發送

}

}.start();

}

});

new Thread("自定義消息隊列")

{//單線程處理所有線程發過來的消息,會以隊列的順序排隊執行

public void run()

{

Looper.prepare();

//查看prepare()里80行和189行,創建了messageQueue、looper

mHandler = new Handler(Looper.myLooper())

//Looper.myLooper()得到當前線程的looper

{

//handler在哪個線程處理消息,取決于Looper在哪個線程創建

@Override

public void handleMessage(Message msg)

{

String content = "當前線程:" + Thread.currentThread().getName() + "msg:" + msg.what;

Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show();

}

};

Looper.loop();//looper開始輪循隊列

}

}.start();

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

注意:

在子線程中直接new handle()會出現以下錯誤,是因為子線程中默認沒有創建Looper對象,需要先調用Looper.prepare()方法啟用Looper。主線程除外,主線程系統會自動為其創建Looper對象,開啟消息循環。

E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exceptionE/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

2. HandlerThread

封裝了Thread和Looper、MessageQueuepublic class MainActivity extends Activity

{

private Handler mHandler;

int what = 0;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

mHandler.sendEmptyMessage(what ++);//主線程發送

new Thread("aaa")

{

public void run()

{

mHandler.sendEmptyMessage(what ++);//“aaa”子線程發送

}

}.start();

}

});

// 因為HandlerThread()里面已經封裝好了Looper.prepare()和Looper.loop();

HandlerThread thread = new HandlerThread("自定義消息隊列");

thread.start();

//thread.getLooper()如果換成Looper.myLooper()就是得到主線程的looper

mHandler = new Handler(thread.getLooper())

{

//handler在哪個線程處理消息,取決于Looper在哪個線程創建

@Override

public void handleMessage(Message msg)

{

String content = "當前線程:" + Thread.currentThread().getName() + "msg:" + msg.what;

Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show();

}

};

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

3. IntentService

Thread、Looper、MessageQueue、Handler、Message

MainActivity中顯式意圖啟動servicepublic class MainActivity extends Activity

{

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{//啟動MyService,傳值過去

Intent service = new Intent(MainActivity.this,MyService.class);

service.putExtra("msg", "aaa");

startService(service );

}

});

}

}

MyService繼承了IntentService,接收到MainActivity傳來的值public class MyService extends IntentService

{

//封裝好了handleMessage();64行

// 寫好了HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

// thread.start();

public MyService()

{//IntentService有個有參的構造方法75行

super("消息隊列IntentService");

}

@Override

public IBinder onBind(Intent intent)

{

// TODO: Return the communication channel to the service.

throw new UnsupportedOperationException("Not yet implemented");

}

@Override

protected void onHandleIntent(Intent intent)

{

String extra = intent.getStringExtra("msg");

String content = "當前線程:" + Thread.currentThread().getName() + "msg:" + extra;

Log.e("onHandleIntent", content);

}

}

總結

以上是生活随笔為你收集整理的android service使用handle,android中对Looper、HandlerThread、IntentService的理解及使用方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。