1. 程式人生 > >安卓第七天---okhttp的簡單使用及非同步任務(Asynctask)下載圖片

安卓第七天---okhttp的簡單使用及非同步任務(Asynctask)下載圖片

程式設計就是要嚴謹,並且要多去了解一些技術的原理,瞭解了原理,一切都會學習的很快,但從一個先想在這個程式設計行業立足來說,首先要知道會用,畢竟實踐出真知,用的多了,就熟了!
扯遠了,首先,在Android studio上,OkHttp現在已經不用去自己像第三方框架那樣去整合他了,只需要在File->Project Structure然後選中需要載入OkHttp的專案點選右上方的Dependencies,右邊又一個綠色的+號,開啟輸入okhttp就能搜到!
在這裡插入圖片描述

選中圖中的那個等載入好久可以使用了!
由於這裡我只用作從網上下載一個圖片,所以這裡就簡單一點了
建立一個類,用作撰寫OkHttp的獨有工具類:
private static OkHttpClient okHttpClient;

public static Bitmap getImageBitmap(String urlPath) {
    Bitmap bitmap = null;
    okHttpClient = new OkHttpClient();
    URL url = null;
    try {
        url = new URL(urlPath);
        //獲取請求物件
        Request request = new Request.Builder().url(url).build();
        //獲取響應體
        ResponseBody responseBody = okHttpClient.newCall(request).execute().body();

        //獲取流--寫入資料
        InputStream inputStream = responseBody.byteStream();

        //轉化成Bitmap
        bitmap = BitmapFactory.decodeStream(inputStream);
        
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return  bitmap;
}

到這裡,一個從網上獲取圖片,然後轉化成Bitmap的方法就做好了,然後就是如何將這個bitmap圖片設定到我們的控制元件上去了.
我們在這裡建立一個非同步任務!
我們可以瞭解到,Android中只有UI執行緒,也就是主執行緒才能進行對UI的更新操作,而其他執行緒是不能直接操作UI的.這樣的好處是保證了UI的穩定性和準確性,避免多個執行緒同時對UI進行操作而造成UI的混亂.但Android是一個多執行緒的作業系統,我們總不能把所有的任務都放在主執行緒中進行實現,比如網路操作,檔案讀取等耗時操作,如果全部放到主執行緒去執行,就可能會造成後面任務的阻塞.Android會去檢測這種阻塞,當阻塞時間太長的時候,就會丟擲Application Not Responsed(ANR)錯誤.所以我們需要將這些耗時操作放在非主執行緒中去執行.這樣既避免了Android的單執行緒模型,又避免了ANR.
所以,在AsyncTask中進行對UI的操作,但是這裡我們為了更好的邏輯體驗,將UI設定還是放置到Activity中進行操作,但是載入放在Asynctask即非同步任務裡面去執行,所以,我們需要設定一個回撥介面SetImage,將引數放到介面之中,然後從Activity中實現
interface SetImage:

   	public interface SetImage {	
   	 public void setImageBitmap(Bitmap bitmap);
	}

AsynctaskDemo.class

public class AsyncDemo extends AsyncTask<String,Void,Bitmap> {
private SetImage setImage;

public AsyncDemo(Context context) {
    setImage = (SetImage) context;
}
@Override
protected Bitmap doInBackground(String... strings) {
    Bitmap bitmap =  OkHttpDownload.getImageBitmap(strings[0]);
    return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
    setImage.setImageBitmap(bitmap);
}
}

AsyncTask主要有如下幾個方法:

doInBackground:必須重寫,非同步執行後臺執行緒要完成的任務,耗時操作將在此方法中完成.

onPreExecute:執行後臺耗時操作前被呼叫,通常用於進行初始化操作.

onPostExecute:當doInBackground方法完成後,系統將自動呼叫此方法,並將doInBackground方法返回的值傳入此方法.通過此方法進行UI的更新.

onProgressUpdate:當在doInBackground方法中呼叫publishProgress方法更新任務執行進度後,將呼叫此方法.通過此方法我們可以知曉任務的完成進度.

實現設定ImageView的主函式

public class MainActivity extends AppCompatActivity implements SetImage{
private ImageView imageView;
private TextView textView;
private String url="這裡是圖片網址";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.image);
    //在未載入圖片之前,先給ImageView一個圖片
    imageView.setImageResource(R.mipmap.ic_launcher);
    //執行Asynctask
    new AsyncDemo(this).execute(url);
}
//通過回撥介面去實現更改ImageView
@Override
public void setImageBitmap(Bitmap bitmap) {
    imageView.setImageBitmap(bitmap);
}
}

下面的截圖:
在這裡插入圖片描述

一個簡單的非同步任務就到這,學無止境,繼續加油!