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的理解及使用方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 拍照不能保存图片格式,A
- 下一篇: android 剩余内存,Android