亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

asynctask的用法詳解

2020-04-11 12:42:50
字體:
來源:轉載
供稿:網友

在開發Android應用時必須遵守單線程模型的原則: Android UI操作并不是線程安全的并且這些操作必須在UI線程中執行。在單線程模型中始終要記住兩條法則:
1. 不要阻塞UI線程
2. 確保只在UI線程中訪問Android UI工具包
當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。
比如說從網上獲取一個網頁,在一個TextView中將其源代碼顯示出來,這種涉及到網絡操作的程序一般都是需要開一個線程完成網絡訪問,但是在獲得頁面源碼后,是不能直接在網絡操作線程中調用TextView.setText()的.因為其他線程中是不能直接訪問主UI線程成員 。

android提供了幾種在其他線程中訪問UI線程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
這些類或方法同樣會使你的代碼很復雜很難理解。然而當你需要實現一些很復雜的操作并需要頻繁地更新UI時這會變得更糟糕。

為了解決這個問題,Android 1.5提供了一個工具類:AsyncTask,它使創建需要與用戶界面交互的長時間運行的任務變得更簡單。相對來說AsyncTask更輕量級一些,適用于簡單的異步處理,不需要借助線程和Handler即可實現。
AsyncTask是抽象類.AsyncTask定義了三種泛型類型 Params,Progress和Result。
Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
Progress 后臺任務執行的百分比。
Result 后臺執行任務最終返回的結果,比如String。
AsyncTask的執行分為四個步驟,每一步都對應一個回調方法,這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。
1) 子類化AsyncTask
2) 實現AsyncTask中定義的下面一個或幾個方法
onPreExecute(), 該方法將在執行實際的后臺操作前被UI thread調用??梢栽谠摲椒ㄖ凶鲆恍蕚涔ぷ?,如在界面上顯示一個進度條。
doInBackground(Params...), 將在onPreExecute 方法執行后馬上執行,該方法運行在后臺線程中。這里將主要負責執行那些很耗時的后臺計算工作??梢哉{用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
onProgressUpdate(Progress...),在publishProgress方法被調用后,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
onPostExecute(Result), 在doInBackground 執行完成后,onPostExecute 方法將被UI thread調用,后臺的計算結果將通過該方法傳遞到UI thread.

為了正確的使用AsyncTask類,以下是幾條必須遵守的準則:
1) Task的實例必須在UI thread中創建
2) execute方法必須在UI thread中調用
3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法
4) 該task只能被執行一次,否則多次調用時將會出現異常
doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個為doInBackground接受的參數,第二個為顯示進度的參數,第第三個為doInBackground返回和onPostExecute傳入的參數。

從網上獲取一個網頁,在一個TextView中將其源代碼顯示出來

復制代碼 代碼如下:

package test.list;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class NetworkActivity extends Activity{
private TextView message;
private Button open;
private EditText url;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.network);
message= (TextView) findViewById(R.id.message);
url= (EditText) findViewById(R.id.url);
open= (Button) findViewById(R.id.open);
open.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
connect();
}
});

}

private void connect() {
PageTask task = new PageTask(this);
task.execute(url.getText().toString());
}


class PageTask extends AsyncTask<String, Integer, String> {
// 可變長的輸入參數,與AsyncTask.exucute()對應
ProgressDialog pdialog;
public PageTask(Context context){
pdialog = new ProgressDialog(context, 0);
pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
dialog.cancel();
}
});
pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
finish();
}
});
pdialog.setCancelable(true);
pdialog.setMax(100);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.show();


}
@Override
protected String doInBackground(String... params) {

try{

HttpClient client = new DefaultHttpClient();
// params[0]代表連接的url
HttpGet get = new HttpGet(params[0]);
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
String s = null;
if(is != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buf = new byte[128];

int ch = -1;

int count = 0;

while((ch = is.read(buf)) != -1) {

baos.write(buf, 0, ch);

count += ch;

if(length > 0) {
// 如果知道響應的長度,調用publishProgress()更新進度
publishProgress((int) ((count / (float) length) * 100));
}

// 讓線程休眠100ms
Thread.sleep(100);
}
s = new String(baos.toByteArray()); }
// 返回結果
return s;
} catch(Exception e) {
e.printStackTrace();

}

return null;

}

@Override
protected void onCancelled() {
super.onCancelled();
}

@Override
protected void onPostExecute(String result) {
// 返回HTML頁面的內容
message.setText(result);
pdialog.dismiss();
}

@Override
protected void onPreExecute() {
// 任務啟動,可以在這里顯示一個對話框,這里簡單處理
message.setText(R.string.task_started);
}

@Override
protected void onProgressUpdate(Integer... values) {
// 更新進度
System.out.println(""+values[0]);
message.setText(""+values[0]);
pdialog.setProgress(values[0]);
}

}

}

最后需要說明AsyncTask不能完全取代線程,在一些邏輯較為復雜或者需要在后臺反復執行的邏輯就可能需要線程來實現了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品少妇网址| 国产午夜精品全部视频播放| 国产精品高清网站| 欧美在线视频网| 亚洲黄页网在线观看| 性欧美亚洲xxxx乳在线观看| 亚洲最大的免费| 91成人免费观看网站| 国产一区二区在线免费视频| 97视频com| 欧美日韩第一页| 中文字幕日韩精品在线观看| 久久手机免费视频| 成人激情视频小说免费下载| 午夜精品www| 国产精品人人做人人爽| 久久天堂电影网| 欧美精品电影在线| 97香蕉久久超级碰碰高清版| 中文字幕国产亚洲| 91免费在线视频网站| 中日韩美女免费视频网站在线观看| 日韩女优人人人人射在线视频| 成人黄色av网| 国产精品一区专区欧美日韩| 91成人免费观看网站| 色久欧美在线视频观看| 97免费视频在线播放| 久久久久久亚洲精品| 亚洲男女自偷自拍图片另类| 中国日韩欧美久久久久久久久| 成人综合网网址| 成人黄色影片在线| 欧美久久精品一级黑人c片| 成人a视频在线观看| 国产视频福利一区| 亚洲精品日韩在线| 国产一区二区美女视频| 久久久久久久国产精品视频| 日韩一二三在线视频播| 欧美成人激情视频免费观看| www.亚洲人.com| 日韩**中文字幕毛片| 久久99亚洲热视| 亚洲精品视频中文字幕| 国产色婷婷国产综合在线理论片a| 这里精品视频免费| 26uuu久久噜噜噜噜| 欧美在线不卡区| 成人妇女淫片aaaa视频| 91中文字幕一区| 久久久999成人| 久久久免费精品| 日韩三级成人av网| 午夜精品久久久久久久男人的天堂| 欧美午夜激情小视频| 亚洲区bt下载| 国产亚洲欧美日韩精品| 成人免费观看a| 欧美日韩一区二区三区在线免费观看| 日韩在线精品视频| 久久成人综合视频| 中文字幕久热精品在线视频| 中文字幕久久久| 亚洲第一福利视频| 欧美日韩在线视频一区| 久久精品国产v日韩v亚洲| 欧美日韩国产限制| 色爱精品视频一区| 日韩精品在线视频| 欧洲中文字幕国产精品| 国产精品亚洲综合天堂夜夜| 成人激情视频在线观看| 日韩欧美精品网址| 日韩理论片久久| 91av在线影院| 午夜精品福利电影| 亚洲黄色在线看| 伊人伊成久久人综合网小说| 亚洲视频视频在线| 久久激情五月丁香伊人| 91国内揄拍国内精品对白| 欧美日韩国产精品一区二区不卡中文| 亚洲精品欧美日韩| 精品女同一区二区三区在线播放| 欧美色播在线播放| 最新国产精品亚洲| 日韩成人小视频| 国产日产欧美精品| 国产精品永久免费在线| 日韩av影片在线观看| 亚洲精品国产精品久久清纯直播| 少妇精69xxtheporn| 欧美日韩亚洲国产一区| 麻豆国产va免费精品高清在线| 国产精自产拍久久久久久| 乱亲女秽乱长久久久| 国产亚洲精品久久久久动| 一区二区三区四区精品| 欧美最猛性xxxxx亚洲精品| 国产激情久久久久| 日韩在线视频网| 国产亚洲视频在线观看| 亚洲风情亚aⅴ在线发布| 日韩专区中文字幕| 亚洲精品国产综合久久| 欧美在线视频一区二区| 亚洲小视频在线| 国产日韩欧美中文| 北条麻妃在线一区二区| 国内精品免费午夜毛片| 欧美高清videos高潮hd| 日韩电影在线观看中文字幕| 日韩中文字幕视频在线观看| 精品自拍视频在线观看| 2019中文字幕免费视频| 国内外成人免费激情在线视频网站| 日本精品免费一区二区三区| 性色av香蕉一区二区| 在线日韩第一页| 久久综合免费视频影院| 成人h视频在线观看播放| 中文字幕在线看视频国产欧美在线看完整| 亚洲资源在线看| 欧美成人h版在线观看| 正在播放亚洲1区| 亚洲美女中文字幕| 亚洲欧美日韩国产中文专区| 亚洲日本aⅴ片在线观看香蕉| 97国产精品视频人人做人人爱| 国产91成人在在线播放| xxxxx成人.com| 日韩av电影手机在线| 久久精品国产亚洲7777| 国产日韩精品在线播放| 欧美大片免费观看在线观看网站推荐| 91精品视频网站| 97香蕉超级碰碰久久免费的优势| 亚洲日本成人网| 亚洲精品成a人在线观看| 精品久久久久人成| 精品国偷自产在线视频| 国产69精品久久久久久| 日本在线观看天堂男亚洲| 久久综合亚洲社区| 亚洲精品小视频在线观看| 国产91在线高潮白浆在线观看| 夜夜躁日日躁狠狠久久88av| 68精品国产免费久久久久久婷婷| 91精品视频免费看| 久久综合国产精品台湾中文娱乐网| 国产午夜精品全部视频在线播放| 黄色精品一区二区| 亚洲国产成人精品女人久久久| 色视频www在线播放国产成人| 欧美日韩一区二区免费视频| 色在人av网站天堂精品| 97精品视频在线播放| 亚洲精品久久久一区二区三区| 欧美性受xxxx黑人猛交| 亚洲在线视频福利| 成人在线观看视频网站| 91手机视频在线观看| 日韩免费黄色av|