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