android 之多线程详解
Android 中進(jìn)程的生命周期:
<1>前臺(tái)進(jìn)程(Foreground process):正在運(yùn)行著和用戶交互的程序的進(jìn)程
<2>可見(jiàn)進(jìn)程(visible process):運(yùn)行著處于可見(jiàn)狀態(tài)組件的進(jìn)程
<3>服務(wù)進(jìn)程(Service process):運(yùn)行著使用startService()方法的服務(wù)同時(shí)沒(méi)有變?yōu)楦鼉蓚€(gè)級(jí)別的進(jìn)程
<4>后臺(tái)進(jìn)程(Background process):運(yùn)行著處于后臺(tái)組件的進(jìn)程,執(zhí)行了Activity的onStop()方法后的進(jìn)程
<5>空進(jìn)程(Empty Process):不包含任何活動(dòng)組建的進(jìn)程,它們的存在是為了緩存的目的,能夠加速重新啟動(dòng)當(dāng)前程序的速度。
UI線程(主線程)模型的兩條規(guī)則:
1.不要阻塞UI線程,否則超過(guò)5s會(huì)出現(xiàn)ANR(Applocation Not Responding)錯(cuò)誤的危險(xiǎn)。
2.不要在非UI線程中更新UI,否則直接報(bào)錯(cuò)。
解決UI線程模型兩條規(guī)則之間的矛盾,提供了三種方式:
A.把主線程請(qǐng)到子線程的家里面,通過(guò)調(diào)用Activity的runOnUiThread(new Runnable(){ ?重寫run方法 }} ); ??
? ?或者是view.post(new Runnable()){ 重寫run方法 }} );
1.Activity.runOnUiThread(Runnable)
2.View.post(Runnable)
3.View.postDelayed(Runnable,long)
B.當(dāng)子線程有更新UI需要的時(shí)候,當(dāng)需要更新數(shù)據(jù)封裝到消息對(duì)象中并反送給主線程進(jìn)行更新UI(Handler機(jī)制) ?以后補(bǔ)充!
C.使用Google提供的AsyncTask(異步)解決。
? ? AsyncTask的特點(diǎn):
? ? 掌握如何構(gòu)建AsyncTask子類:
? ? 掌握AsyncTask<String,Integer,String>三個(gè)泛型參數(shù)的說(shuō)明:
<1>第一個(gè)參數(shù):指定當(dāng)我們啟動(dòng)異步任務(wù)(execute()方法實(shí)參的數(shù)據(jù)類型)時(shí)傳遞給doInBackground(String...parms)
? ? ? 方法的形參的數(shù)據(jù)類型加上。。。
<2>第二個(gè)參數(shù):指定對(duì)外報(bào)告進(jìn)度時(shí)調(diào)用方法publish Progress()中實(shí)參的數(shù)據(jù)類型。。。也是?
? ? ? ? ? onProgressUpdate(Integer...values)方法形參的數(shù)據(jù)類型。。。
<3>第三個(gè)參數(shù):指定doInBackground(String...parms)方法返回值的數(shù)據(jù)類型,也是onPostExcute(String s)方法形參的數(shù)據(jù)類型
示例代碼:
package com.hsj.example.asynctaskdemo01;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView textView_info;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.textView_info= (TextView) this.findViewById(R.id.textView_info);}/*** android 單線程模型的內(nèi)容:* 1.不要阻塞UI線程,因?yàn)槌^(guò)5秒后可能會(huì)出現(xiàn)ANR(Application Not Response) 應(yīng)用程序無(wú)響應(yīng)錯(cuò)誤* 2.不要在子線程中直接更新UI,否則會(huì)直接報(bào)錯(cuò)*** 為了解決android單線程模型的問(wèn)題,我們提供了三種解決方案:* A:把主線程請(qǐng)到子線程的家里來(lái)* 1. Activity.runOnUiThread(Runnable)*2. View.post(Runnable)3. View.postDelayed(Runnable, long)** B:使用Handler機(jī)制(當(dāng)子線程有更新UI的意愿時(shí),把需要更新的數(shù)據(jù)封裝成消息傳遞到主線程中在更新UI),將在第十八章詳解** C:使用異步任務(wù)解決,這章的重點(diǎn).** @param view*/public void click(View view){/*在java 中開(kāi)啟子線程有兩種方式:A:繼承Thread 類B:實(shí)現(xiàn)Runnable 接口*/new Thread(){@Overridepublic void run() {String threadName=Thread.currentThread().getName();System.out.println("threadName="+threadName);//模擬耗時(shí)操作,比如網(wǎng)絡(luò)下載/* try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}*/final String info="你點(diǎn)我的后果看到了嗎?";/*//在子線程中開(kāi)辟一塊主線程的執(zhí)行區(qū)域,方式一:runOnUiThread(new Runnable() {*//*** run()方法就運(yùn)行在主線程中了*//*@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在內(nèi)部類中訪問(wèn)外部類的局部變量則需要將局部變量變成常量textView_info.setText(info);}});*//*//方式二:textView_info.post(new Runnable() {@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在內(nèi)部類中訪問(wèn)外部類的局部變量則需要將局部變量變成常量textView_info.setText(info);}});*///方式三:postDelayed(runnable,long):延遲long 毫秒后執(zhí)行run()方法textView_info.postDelayed(new Runnable() {@Overridepublic void run() {String myName=Thread.currentThread().getName();System.out.println("Runnable.myName="+myName);//更新UI,在內(nèi)部類中訪問(wèn)外部類的局部變量則需要將局部變量變成常量textView_info.setText(info);}},2000);}}.start();} }異步任務(wù)的實(shí)例:
點(diǎn)擊打開(kāi)鏈接
總結(jié)
以上是生活随笔為你收集整理的android 之多线程详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 找亲爹取名,女的可以吗?
- 下一篇: android 之使用多线程中的Asy