程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻懂得線程平安與Singleton

深刻懂得線程平安與Singleton

編輯:關於C++

深刻懂得線程平安與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就給年夜家引見到這裡,願望對年夜家有所贊助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved