日韩性视频-久久久蜜桃-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 之多线程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 艳妇臀荡乳欲伦交换gif | 91网站视频在线观看 | 亚洲天堂精品在线 | 茄子av| 成人二区三区 | 一区二区高清 | 精品人妻一区二区三区四区五区 | 久久精品亚洲一区二区 | 777片理伦片在线观看 | 色小说在线观看 | 国产精品com | 一级日韩毛片 | 日韩精品免费一区二区三区 | 极品粉嫩小仙女高潮喷水久久 | 欧美丰满熟妇xxxx | 中国挤奶哺乳午夜片 | 五色天婷婷 | 人人狠狠综合久久亚洲 | 国产精品视频无码 | 欧美成人极品 | 久久久久久影院 | 蜜桃中文字幕 | 国产精品suv一区二区 | 亚洲精品视频国产 | 国产无遮挡又黄又爽又色 | 日韩视频区 | 欧美aa在线观看 | 国内自拍xxxx18| 国产黄色的视频 | 久一国产| 欧美人与性动交α欧美片 | 国产高清黄色 | 日韩成人精品一区二区三区 | 久久久久久黄色 | 亚洲黄片一区二区 | 亚洲视频播放 | 成人在线免费电影 | 国产精品久久久免费 | 成人免费高清在线播放 | 国产欧美精品一区二区色综合朱莉 | 亚洲成人a√ | 日韩成人免费视频 | 国产香蕉视频在线观看 | 日本高清视频www夜色资源 | 成人在线观看黄色 | 国产日韩欧美中文字幕 | 在线中文天堂 | 男人天堂亚洲 | 久久久久久久成人 | 麻豆视频在线播放 | 九色视频国产 | 欧洲成人一区二区三区 | 日韩有码在线观看 | 射网站 | 在线观看国产一区 | 草碰在线视频 | 欧美偷拍亚洲 | 欧美大色| 亚洲色图首页 | 国产1区2区3区| 在厨房拨开内裤进入毛片 | 欧美黑人添添高潮a片www | 四虎国产在线观看 | 久久99精品久久久久婷婷 | 国产精品高清在线观看 | 国产黄色大片免费看 | 韩国中文字幕hd久久精品 | 官场艳妇疯狂性关系 | 色中文 | 无遮挡在线观看 | 欧美男人又粗又长又大 | 国产精品一区二区麻豆 | 黄色美女视频网站 | 女生喷液视频 | 成年人免费视频观看 | 一色道久久88加勒比一 | 男同av在线观看一区二区三区 | 中文字幕偷拍 | 欧美日性视频 | 亚洲av无码专区国产乱码不卡 | 久久精品免费在线 | 国产一区黄色 | 国产在线拍揄自揄拍无码 | 久久精品99国产国产精 | 最新日韩av在线 | 国产一级片久久 | 动漫av在线播放 | av一级黄色 | 久久丫精品 | 777精品 | 亚洲 欧洲 日韩 | 蜜桃成熟时李丽珍在线观看 | 国产精品一区二区欧美 | 日韩一级完整毛片 | 丁香一区二区 | 成人av动漫 | 男男免费视频 | 日本羞羞网站 | www.久热 |