深刻懂得線程平安與Singleton。本站提示廣大學習愛好者:(深刻懂得線程平安與Singleton)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得線程平安與Singleton正文
AsyncTask是一個很經常使用的API,特別異步處置數據並將數據運用到視圖的操作場所。其實AsyncTask其實不是那末好,乃至有些蹩腳。本文我會講AsyncTask會惹起哪些成績,若何修復這些成績,而且關於AsyncTask的一些替換計劃。
AsyncTask
從Android API 3(1.5 Cupcake)開端,AsyncTask被引入用來贊助開辟者更簡略地治理線程。現實上在Android 1.0和1.1也是有相似的完成,那就是UserTask。UserTask和AsyncTask有著雷同的API及完成,然則因為因為1.0和1.1的裝備份額微不足道,這裡的概念就不會觸及到UserTask。
性命周期
關於AsyncTask存在一個如許普遍的誤會,許多人以為一個在Activity中的AsyncTask會跟著Activity的燒毀而燒毀。然後現實並不是如斯。AsyncTask會一向履行doInBackground()辦法直到辦法履行停止。一旦上述辦法停止,會根據情形停止分歧的操作。
假如cancel(boolean)挪用了,則履行onCancelled(Result)辦法
假如cancel(boolean)沒有挪用,則履行onPostExecute(Result)辦法
AsyncTask的cancel辦法須要一個布爾值的參數,參數名為mayInterruptIfRunning,意思是假如正在履行能否可以打斷, 假如這個值設置為true,表現這個義務可以被打斷,不然,正在履行的法式會持續履行直到完成。假如在doInBackground()辦法中有一個輪回操作,我們應當在輪回中應用isCancelled()來斷定,假如前往為true,我們應當防止履行後續無用的輪回操作。
總之,我們應用AsyncTask須要確保AsyncTask准確地撤消。
AsyncTask和Handler比較
1 ) AsyncTask完成的道理,和實用的優缺陷
AsyncTask,是android供給的輕量級的異步類,可以直接繼續AsyncTask,在類中完成異步操作,並供給接口反應以後異步履行的水平(可以經由過程接話柄現UI進度更新),最初反應履行的成果給UI主線程.
應用的長處:
簡略,快捷
進程可控
應用的缺陷:
在應用多個異步操作和並須要停止Ui變革時,就變得龐雜起來.
2 )Handler異步完成的道理和實用的優缺陷
在Handler 異步完成時,觸及到 Handler, Looper, Message,Thread四個對象,完成異步的流程是主線程啟動Thread(子線程)àthread(子線程)運轉並生成Message-àLooper獲得Message並傳遞給HandleràHandler逐一獲得Looper中的Message,並停止UI變革。
應用的長處:
構造清楚,功效界說明白
關於多個後台義務時,簡略,清楚
應用的缺陷:
在單個後台異步處置時,顯得代碼過量,構造過於龐雜(絕對性)
AsyncTask引見
Android的AsyncTask比Handler更輕量級一些,實用於簡略的異步處置。
起首明白Android之所以有Handler和AsyncTask,都是為了不壅塞主線程(UI線程),且UI的更新只能在主線程中完成,是以異步處置是弗成防止的。
Android為了下降這個開辟難度,供給了AsyncTask。AsyncTask就是一個封裝過的後台義務類,望文生義就是異步義務。
AsyncTask直接繼續於Object類,地位為android.os.AsyncTask。要應用AsyncTask任務我們要供給三個泛型參數,偏重載幾個辦法(至多重載一個)。
AsyncTask界說了三種泛型類型 Params,Progress和Result。
•Params 啟動義務履行的輸出參數,好比HTTP要求的URL。
•Progress 後台義務履行的百分比。
•Result 後台履行義務終究前往的成果,好比String。
應用過AsyncTask 的同窗都曉得一個異步加載數據起碼要重寫以下這兩個辦法:
•doInBackground(Params…) 後台履行,比擬耗時的操作都可以放在這裡。留意這裡不克不及直接操作UI。此辦法在後台線程履行,完成義務的重要任務,平日須要較長的時光。在履行進程中可以挪用publicProgress(Progress…)來更新義務的進度。
•onPostExecute(Result) 相當於Handler 處置UI的方法,在這外面可使用在doInBackground 獲得的成果處置操作UI。 此辦法在主線程履行,義務履行的成果作為此辦法的參數前往
有需要的話你還得重寫以下這三個辦法,但不是必需的:
•onProgressUpdate(Progress…) 可使用進度條增長用戶體驗度。 此辦法在主線程履行,用於顯示義務履行的進度。
•onPreExecute() 這裡是終究用戶挪用Excute時的接口,當義務履行之前開端挪用此辦法,可以在這裡顯示進度對話框。
•onCancelled() 用戶挪用撤消時,要做的操作
應用AsyncTask類,以下是幾條必需遵照的原則:
•Task的實例必需在UI thread中創立;
•execute辦法必需在UI thread中挪用;
•不要手動的挪用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個辦法;
•該task只能被履行一次,不然屢次挪用時將會湧現異常;
一個超簡略的懂得 AsyncTask 的例子:
main.xml
<?xml version="." encoding="utf-"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progressBar" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="更新progressbar" /> </LinearLayout>
MainActivity.java
package vic.wong.main; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends Activity { private Button button; private ProgressBar progressBar; private TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button)findViewById(R.id.button); progressBar = (ProgressBar)findViewById(R.id.progressBar); textView = (TextView)findViewById(R.id.textView); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar); asyncTask.execute(); } }); } }
NetOperator.java
package vic.wong.main; //模仿收集情況 public class NetOperator { public void operator(){ try { //休眠秒 Thread.sleep(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
ProgressBarAsyncTask .java
package vic.wong.main; import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView; /** * 生成該類的對象,並挪用execute辦法以後 * 起首履行的是onProExecute辦法 * 其次履行doInBackgroup辦法 * */ public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { private TextView textView; private ProgressBar progressBar; public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) { super(); this.textView = textView; this.progressBar = progressBar; } /** * 這裡的Integer參數對應AsyncTask中的第一個參數 * 這裡的String前往值對應AsyncTask的第三個參數 * 該辦法其實不運轉在UI線程傍邊,重要用於異步操作,一切在該辦法中不克不及對UI傍邊的空間停止設置和修正 * 然則可以挪用publishProgress辦法觸發onProgressUpdate對UI停止操作 */ @Override protected String doInBackground(Integer... params) { NetOperator netOperator = new NetOperator(); int i = ; for (i = ; i <= ; i+=) { netOperator.operator(); publishProgress(i); } return i + params[].intValue() + ""; } /** * 這裡的String參數對應AsyncTask中的第三個參數(也就是吸收doInBackground的前往值) * 在doInBackground辦法履行停止以後在運轉,而且運轉在UI線程傍邊 可以對UI空間停止設置 */ @Override protected void onPostExecute(String result) { textView.setText("異步操作履行停止" + result); } //該辦法運轉在UI線程傍邊,而且運轉在UI線程傍邊 可以對UI空間停止設置 @Override protected void onPreExecute() { textView.setText("開端履行異步線程"); } /** * 這裡的Intege參數對應AsyncTask中的第二個參數 * 在doInBackground辦法傍邊,,每次挪用publishProgress辦法都邑觸發onProgressUpdate履行 * onProgressUpdate是在UI線程中履行,一切可以對UI空間停止操作 */ @Override protected void onProgressUpdate(Integer... values) { int vlaue = values[]; progressBar.setProgress(vlaue); } }
關於Android 中的AsyncTask就給年夜家引見到這裡,願望對年夜家有所贊助!