因為我們都知道在Android中的是單線程模型,不允許其他的子線程來更新UI,只允許UI線程(主線程更新UI),否則會多個線程都去更新UI會造成UI的一個混亂有些耗時的操縱(例如網(wǎng)絡請求等),如果直接放到主線程中去請求的話則會造成主線程阻塞,而我們系統(tǒng)有規(guī)定的響應時間,當響應的時間超過了了阻塞的時間就會造成"Application No Response",也就是我們熟知的ANR錯誤解決上述問題的時候:我們一般使用的是線程或者線程池+Handler機制如果線程拿到一個數(shù)據(jù)需要去更新UI,那么就需要Handler把子線程的更新UI的數(shù)據(jù)發(fā)消息給主線程,從而讓主線程去更新UI那么還在使用Thread或ThreadPool+Handler的你是否已經厭倦這些繁瑣的操縱而且你會發(fā)現(xiàn)這些操作的代碼都很類似。所以AsyncTask就應運而生了。
成都創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站制作、網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元順昌做網(wǎng)站,已為上家服務,為順昌各地企業(yè)和個人服務,聯(lián)系電話:18980820575
**
* 封裝ProecssDialog對話框
*
*/
public class LoadDialog extends ProgressDialog {
private String title = "進度對話框";
private String message = "加載數(shù)據(jù)中....";
public LoadDialog(Context context, int theme) {
super(context, theme);
}
/**
* 用默認的標題和內容來創(chuàng)建對話框
* @param context
*/
public LoadDialog(Context context) {
super(context);
initDialog();
}
/**
* 用指定的標題和內容來創(chuàng)建對話框
* @param context
* @param title
* @param message
*/
public LoadDialog(Context context,String title,String message){
super(context);
if(title != null){
this.title = title;
}
if(message != null){
this.message = message;
}
initDialog();
}
/**
* 初始化對話框參數(shù),默認對話框不可以取消
*/
public void initDialog(){
setTitle(title);
setMessage(message);
setProgressStyle(ProgressDialog.STYLE_SPINNER);
setCancelable(false);
}
/**
* 打開對話框,設置回調方法,傳遞需要執(zhí)行業(yè)務方法的類模板,方法名和參數(shù)列表
* @param callback 回調方法,該方法在對話框關閉后回調,并獲取返回的數(shù)據(jù)
* @param serviceClass 執(zhí)行業(yè)務方法的類模板
* @param method 執(zhí)行業(yè)務方法的方法名
* @param params 執(zhí)行業(yè)務方法的參數(shù)列表
*/
public void execute(Callback callback,Class serviceClass,String method,Object... params){
super.show();
ServiceAysnTask task = new ServiceAysnTask(callback,serviceClass,method);
task.execute(params);
}
/**
* 回調方法的接口
*
*/
public interface Callback{
public void getResult(Map map);
}
/**
* 與遠程服務通信的線程類
* @author BDK
* AsyncTask 異步任務
*/
private class ServiceAysnTask extends AsyncTaskobject,object,map{
private Class serviceClass;
private String method;
private Callback callback;
public ServiceAysnTask(Callback callback,Class serviceClass,String method){
this.callback = callback;
this.serviceClass = serviceClass;
this.method = method;
}
@Override
protected Map doInBackground(Object... params) {
Map resultMap = null;
try {
Object obj = serviceClass.newInstance();//創(chuàng)建類模板對象
Class [] paramTypes = new Class[params.length];
for (int i = 0; i paramTypes.length; i++) {
paramTypes[i] = params[i].getClass();
}
//根據(jù)類模板得到方法
Method m = serviceClass.getMethod(method, paramTypes);
resultMap = (Map) m.invoke(obj, params);
} catch (Exception e) {
e.printStackTrace();
}
LoadDialog.this.cancel();
return resultMap;
}
@Override
protected void onPostExecute(Map result) {
super.onPostExecute(result);
if(result == null){
Toast.makeText(LoadDialog.this.getContext(), "網(wǎng)絡通信異常", Toast.LENGTH_LONG).show();
return;
}
callback.getResult(result);
}
}
}
/object,object,map
1、Adapter不屬于異步加載,獲取Adapter需要的數(shù)據(jù)后,在UI線程中調用setAdapter()設置數(shù)據(jù),百度一下TeachCourse,就知道了!
目前沒有同步加載數(shù)據(jù)這種做法,如果網(wǎng)絡延遲主界面UI就卡死了,
之后用戶不耐煩就只能強行關閉了,卡死的時候按鍵都沒反應的。
一個簡單的的多線程
class updatelocationTask extends AsyncTaskString, Integer, Response {
protected void onPreExecute() {
//這里寫執(zhí)行doInBackground方法之前要做的什么,比如說彈出ProgressDialog
}
}
@Override
protected Response doInBackground(String... params) {
//這里就是線程里面的方法了,比如說建立連接,請求數(shù)據(jù)
}
}
protected void onPostExecute(Response result) {
//這里可以根據(jù)返回值來確定怎么操作,比如說刷新列表或者提示用戶網(wǎng)絡不暢,是否再次刷新
}
}
}
}