Android中异步任务AsyncTask的使用
1、當程序啟動的時候,Android同時會啟動一個對應的線程,【主線程、UI線程】主要負責處理與UI相關的線程
2、UI線程不允許訪問網絡進行耗時操作
3、子線程不允許更新UI。
由于Android中主線程不能訪問網絡、子線程不能更新UI,需要線程間通訊 完成數據對象傳遞。Android在1.5版本引入了AsyncTask. AsyncTask的特點是任務在主線程之外運行,而回調方法是在主線程中執行,這就有效地避免了使用Handler帶來的麻煩。閱讀AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來管理線程以及任務的執行的,concurrent框架是一個非常成熟,高效的框架,經過了嚴格的測試。這說明AsyncTask的設計很好的解決了匿名線程存在的問題。
AsyncTask定義了三種泛型類型 Params,Progress和Result.
子類必須實現抽象方法doInBackground(Params… p) ,在此方法中實現任務的執行工作,比如連接網絡獲取數據等。通常還應該實現onPostExecute(Result r)方法,因為應用程序關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創建實例。
onPreExecute()當任務執行之前開始調用此方法,可以在這里顯示進度對話框。
doInBackground(Params…)此方法在后臺線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
onProgressUpdate(Progress…)此方法在主線程執行,用于顯示任務執行的進度。
onPostExecute(Result)此方法在主線程執行,任務執行的結果作為此方法的參數返回。
實例::
xml:
Activity::
package com.zjs.imageview;import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast;import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;public class IntentActivity extends AppCompatActivity implements View.OnClickListener {private ProgressDialog dialog;private ImageView mImage;private Button mDown_load;private String path = "http://cdnq.duitang.com/uploads/item/201505/20/20150520102944_CiL3M.jpeg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_intent);init();mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);}private void init() {mImage = (ImageView) findViewById(R.id.downloadimage);mDown_load = (Button) findViewById(R.id.down_load);mDown_load.setOnClickListener(this);dialog = new ProgressDialog(this);dialog.setCancelable(true);dialog.setTitle("提醒");dialog.setMessage("正在下載中...");dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);}@Overridepublic void onClick(View view) {new DownLoadImageTask().execute(path);}private class DownLoadImageTask extends AsyncTask<String, Integer, Bitmap> {@Overrideprotected void onPreExecute() {dialog.show();super.onPreExecute();}@Overrideprotected Bitmap doInBackground(String... params) {URL myFileUrl = null;Bitmap bitmap = null;InputStream is = null;HttpURLConnection conn = null;try {myFileUrl = new URL(params[0]);} catch (MalformedURLException e) {e.printStackTrace();}try {conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (conn != null) {conn.disconnect();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bitmap;}@Overrideprotected void onProgressUpdate(Integer... values) {dialog.setProgress(values[0]);super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {mImage.setImageBitmap(result);Toast.makeText(getApplication(), "下載成功", Toast.LENGTH_LONG).show();} else {Toast.makeText(getApplication(), "下載失敗", Toast.LENGTH_LONG).show();}dialog.dismiss();super.onPostExecute(result);}}public Bitmap getBitmapFromNet(String Imagepath) {HttpURLConnection conn;try {URL url = new URL(Imagepath);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("get");conn.setDoInput(true); //允許輸入流,即允許下載conn.setDoOutput(true); //允許輸出流,即允許上傳conn.setUseCaches(false); //不使用緩沖conn.setRequestMethod("GET"); //使用get請求conn.connect();if (conn.getResponseCode() == 200) {Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());if (bitmap != null) {return bitmap;}} else {Toast.makeText(this, "網絡連接失敗", Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}return null;} }經過測試,可以實現圖片下載。
總結
以上是生活随笔為你收集整理的Android中异步任务AsyncTask的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本使用外置显卡到底靠不靠谱笔记本可以
- 下一篇: 世界上最牛的鲨鱼有哪些(地球上10大最厉