Android多線(xiàn)程編程方法及開(kāi)啟步驟
實(shí)現(xiàn)線(xiàn)程的兩種方式
使用繼承的方法
class MyThread extends Thread{
@Override
public void run(){
//處理具體的邏輯
}
}
要啟動(dòng)這個(gè)線(xiàn)程,在主線(xiàn)程中新建一個(gè)該實(shí)例,調(diào)用其start()方法即可。
使用實(shí)現(xiàn)Runnable借口的方式
class MyThread implements Runnable{
@Override
public void run(){
//處理具體的邏輯
}
}
開(kāi)啟現(xiàn)成時(shí),使用:
MyThread myThread = new MyThread();
new Thread(MyThread).start();
匿名類(lèi)的方法去實(shí)現(xiàn)Runnable也是一樣的
new Thread(new Runnalbe(){
@Override
public void run(){
//處理具體邏輯
}
}).start();
異步操作
和很多的GUI庫(kù)一樣,Android的UI也是線(xiàn)程不安全的,所以,我們不能在子線(xiàn)程中更新UI元素。
我們需要通過(guò)異步的操作通過(guò)子線(xiàn)程向主線(xiàn)程通信的方式來(lái)將UI更新的操作交給主線(xiàn)程來(lái)完成。
Handler和Message結(jié)合傳遞的方法
這里,有Message、Handler、MessageQueue和Looper在作用。
1、Message是縣城之間傳遞的消息。
2、Handler是處理者,用于發(fā)送和處理消息
3、MessageQueue是消息隊(duì)列的意思,存放通過(guò)Handler發(fā)送的消息。
4、Looper是每個(gè)線(xiàn)程中的MessageQueue的管家。
Handler handler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case UPDATA_TEXT:
txvHello.setText("Nice to meet you!");
break;
default:
break;
}
}
};
8new Thread(new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = UPDATA_TEXT;
handler.sendMessage(msg);
}
}).start();
使用Async Task
Async Task是一個(gè)抽象類(lèi),我們要使用它,就要先對(duì)他進(jìn)行處理。
3個(gè)參數(shù):
1、Params在執(zhí)行AsyncTask時(shí)需要傳入的參數(shù),可用于在后臺(tái)服務(wù)中使用。
2、Progress如果需要在界面上顯示當(dāng)前的進(jìn)度,使用這里的泛型作為進(jìn)度單位。
3、Result任務(wù)執(zhí)行完畢后,對(duì)結(jié)果進(jìn)行返回。
4個(gè)重寫(xiě)的方法:
1、onPreExecute()
2、DoInBackground(。。。)
3、onProgressUpdate(。。。)
4、onPostExecute(Result)
public class DownloadTask extendsAsyncTask{
TextView txvDownloading;
ProgressBar progressBar;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setMax(100);
}
public DownloadTask(TextView txvDownloading, ProgressBar progressBar) {
this.txvDownloading = txvDownloading;
this.progressBar = progressBar;
}
@Override
protected Integer doInBackground(Void... params) {
int count = 0;
for (int i =100; i > 0; i-- ){
count++;
publishProgress(count);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return count;
}
@Override
protected void onProgressUpdate(Integer... values) {
int a = values[0];
Log.d("TAG",a+"");
progressBar.setProgress(a);
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if(integer.equals(100)){
txvDownloading.setText("Done");
}else{
txvDownloading.setText("downloading");
}
}
}
在Mainactivity中只需要寫(xiě)入:
1new DownloadTask(txvShow, prgsDownload).execute();
即可。
服務(wù)
什么是服務(wù):服務(wù)是Android的四大組件之一,在后臺(tái)運(yùn)行
創(chuàng)建服務(wù)
創(chuàng)建一個(gè)繼承Service的類(lèi),
其中onBind方法是默認(rèn)重寫(xiě)的,其他的還有3個(gè)重要的方法,onCreate()、onStartCommand()、onDestroy()。
1、onCreate()方法會(huì)在服務(wù)創(chuàng)建的時(shí)候調(diào)用
2、onStartCommand()會(huì)在每次服務(wù)啟動(dòng)的時(shí)候調(diào)用
3、onDestroy()會(huì)在服務(wù)銷(xiāo)毀的時(shí)候調(diào)用。
每個(gè)服務(wù)都必須在AndroidManifest.xml中注冊(cè)才能生效。
啟動(dòng)和關(guān)閉服務(wù)
通過(guò)Intent我們可以來(lái)開(kāi)啟和關(guān)閉服務(wù)
switch (v.getId()){
case R.id.btn_start:
Intent startTntent = new Intent(this, MyService.class);
startService(startTntent);
break;
case R.id.btn_stop:
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
break;
default:
break;
}
onBind方法,綁定服務(wù)
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder{
public void startDownload(){
Log.d("TAG","StartDownload");
}
public int getProgress(){
Log.d("TAG","getProgress executed");
return 0;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private ServiceConnection connection = newServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
case R.id.btn_bindstart:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE);
break;
case R.id.btn_bindstop:
unbindService(connection);
服務(wù)器的生命周期:
略。
更多的服務(wù)---前臺(tái)服務(wù)
類(lèi)似于通知的使用方法,在onCreate代碼中構(gòu)建Notification對(duì)象,建立Intent對(duì)象,PendingIntent,setLatestEventInfo,接下來(lái)是startForeground方法
public void onCreate() {
super.onCreate();
Notification notification = newNotification(R.drawable.ic_launcher,"Notification comes",System.currentTimeMillis());
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
startForeground(1,notification);
}
7. IntentService
為了避免在主線(xiàn)程中出現(xiàn)耗時(shí)邏輯,我們需要使用Android的多線(xiàn)程編程的方法,將耗時(shí)邏輯放入線(xiàn)程中進(jìn)行。
@Override
public int onStartCommand(Intent intent, int flags,int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//處理耗時(shí)邏輯
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
在耗時(shí)邏輯執(zhí)行完成了之后,如果我們希望服務(wù)在處理完這些內(nèi)容之后就自動(dòng)關(guān)閉,呢么在耗時(shí)邏輯的最后加上stopSelf()方法是個(gè)不錯(cuò)的選擇。
當(dāng)然這里要可以使用IntentService類(lèi),它可以簡(jiǎn)單的創(chuàng)建一個(gè)異步的,會(huì)自動(dòng)停止的服務(wù)。
public class MyIntentService extends IntentService{
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
*
*/
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
for (int a = 10; a > 0; a--){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TAG", ""+a);
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy");
}
}
ase R.id.btn_intentservice:
Intent intentService = newIntent(this,MyIntentService.class);
startService(intentService);
break;