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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

android 之多线程详解

發布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView;import java.util.Arrays;/*** https://www.baidu.com/img/bd_logo1.png?qua=high&where=super*/ public class MainActivity_bak04 extends AppCompatActivity {private TextView textView_info;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.textView_info= (TextView) this.findViewById(R.id.textView_info);//實例化對話框對象this.progressDialog=new ProgressDialog(this);this.progressDialog.setMax(100);//將對話框樣式設置成水平進度對話框this.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//當執行execute()方法時會自動調用doInBackground(Void... params)new MyAsyncTask().execute("http://www.baidu.com","http://www.163.com");// new MyAsyncTask().execute("http://www.baidu.com","http://www.163.com");//MyAsyncTask myAsyncTask=new MyAsyncTask();//myAsyncTask.execute("http://www.baidu.com","http://www.163.com");/*異步任務不能多次啟動,否則報異常:Cannot execute task: the task is already running*///myAsyncTask.execute("http://www.baidu.com","http://www.163.com");}/*** AsyncTask<String,Integer,String>三個泛型參數說明:* 第一個參數:指定當我們啟動異步任務(execute()方法實參的數據類型)時傳遞給doInBackground(String... params)方法的形參的數據類型加上...* 第二個參數:指定對外報告進度時調用方法publishProgress()中實參的數據類型....,也是onProgressUpdate(Integer... values)方法形參的數據類型...* 第三個參數:指定doInBackground(String... params)方法返回值的數據類型,也是onPostExecute(String s)方法形參的數據類型**/private final class MyAsyncTask extends AsyncTask<String,Integer,String>{@Overrideprotected void onPreExecute() {//設置進度對話框的提示消息progressDialog.setMessage("開始下載網絡圖片......");//顯示進度對話框progressDialog.show();System.out.println("===onPreExecute()===");}@Overrideprotected String doInBackground(String... params) {System.out.println("===doInBackground(String... params="+params+")==");System.out.println("params="+ Arrays.toString(params));//publishProgress(10,20,30);//報告進度的值會傳遞給onProgressUpdate(Integer... values)方法的形參valuesfor(int i=0;i<100;i++){publishProgress(i);if(i==50){System.out.println("===用戶取消了下載====");//取消執行耗時操作this.cancel(true);}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}return "網絡下載數據完畢";}@Overrideprotected void onProgressUpdate(Integer... values) {progressDialog.setProgress(values[0]);System.out.println("===onProgressUpdate(Integer... values="+Arrays.toString(values)+")===");}/*** 當用戶執行了取消異步任務的操作后自動調用的方法,此時就不再調用onPostExecute(String s)* 當前方法也是運行在主線程中*/@Overrideprotected void onCancelled() {//銷毀進度對話框progressDialog.dismiss();String threadName=Thread.currentThread().getName();System.out.println("===onCancelled().threadName="+threadName);}/*** 當正常執行完畢異步任務中的doInBackground()方法后指定調用的方法* @param s*/@Overrideprotected void onPostExecute(String s) {//銷毀進度對話框progressDialog.dismiss();System.out.println("===onPostExecute(String s="+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 之多线程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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