安卓进阶系列-08异步加载AsynsTask使用
生活随笔
收集整理的這篇文章主要介紹了
安卓进阶系列-08异步加载AsynsTask使用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
利用AsyncTask和OkHttp進(jìn)行API數(shù)據(jù)請(qǐng)求
- 背景
- 從安卓3.0開(kāi)始,不允許在主線(xiàn)程和UI線(xiàn)程中進(jìn)行網(wǎng)絡(luò)請(qǐng)求,因?yàn)榭赡軙?huì)造成線(xiàn)程堵塞。
- 因此,只能在子線(xiàn)程進(jìn)行網(wǎng)絡(luò)請(qǐng)求,出現(xiàn)了很多請(qǐng)求的方法,例如開(kāi)啟子線(xiàn)程利用Message傳遞數(shù)據(jù),或者OkHttp封裝了異步請(qǐng)求,會(huì)開(kāi)啟新線(xiàn)程進(jìn)行網(wǎng)絡(luò)請(qǐng)求。
- 本案例使用OkHttp(主要因?yàn)榉奖闶褂?#xff0c;比起HttpConnection和HttpClient效率不遑多讓,甚至仍有勝之)進(jìn)行網(wǎng)絡(luò)請(qǐng)求,但是使用同步請(qǐng)求(不會(huì)開(kāi)啟新的線(xiàn)程,因此會(huì)崩潰)。
- 本案例,處理網(wǎng)絡(luò)請(qǐng)求的方式為異步加載處理,利用AsyncTask開(kāi)啟一個(gè)異步任務(wù),任務(wù)返回結(jié)果并進(jìn)行處理操作。
- 配置
- 添加okhttp和gson的依賴(lài)
- implementation 'com.squareup.okhttp3:okhttp:3.10.0'
- implementation 'com.google.code.gson:gson:2.8.2'
- 添加okhttp和gson的依賴(lài)
- 介紹
- 一般,將任務(wù)封裝為一個(gè)類(lèi)并繼承AsyncTask<Params, Progress,Result>。繼承AsyncTask需要指定三個(gè)泛型參數(shù)。
- Params:啟動(dòng)任務(wù)時(shí)輸入?yún)?shù)的類(lèi)型,我這里傳入了一個(gè)URL路徑。
- Progress:后臺(tái)任務(wù)執(zhí)行中返回進(jìn)度值的類(lèi)型,可以用來(lái)顯示進(jìn)度。
- Result:后臺(tái)任務(wù)完成后返回結(jié)果的類(lèi)型,我這里是一個(gè)自定義的Item。
- 如果你用的IDE是比較智能的如Android Studio,那么會(huì)提示實(shí)現(xiàn)相應(yīng)的方法,其中doInBackGround是必須實(shí)現(xiàn)的,也是唯一一個(gè)子線(xiàn)程的方法。
- doInBackGround:必須重寫(xiě),子線(xiàn)程在這個(gè)方法里面進(jìn)行耗時(shí)操作。(這個(gè)方法的進(jìn)行在子線(xiàn)程中)
- onPreExecute:執(zhí)行后臺(tái)耗時(shí)操作前被調(diào)用,通常在方法里面進(jìn)行一些初始化的操作。
- onPostExecute:當(dāng)doInBackground完成后,系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)方法,并且將doInBackground方法返回的值傳給該方法。
- onProgressUpdate:在doInBackground方法中調(diào)用publishProgress方法時(shí),更新任務(wù)的執(zhí)行進(jìn)度后,會(huì)觸發(fā)這個(gè)方法。
- 一般,將任務(wù)封裝為一個(gè)類(lèi)并繼承AsyncTask<Params, Progress,Result>。繼承AsyncTask需要指定三個(gè)泛型參數(shù)。
- 實(shí)戰(zhàn)使用
- 首先需要在manifest文件中添加網(wǎng)絡(luò)權(quán)限。
- 使用OkHttp+AsyncTask發(fā)送網(wǎng)絡(luò)請(qǐng)求并使用Gson解析API數(shù)據(jù),渲染到界面的一個(gè)TextView上。
- 簡(jiǎn)單編寫(xiě)一個(gè)只含有name屬性的Bean類(lèi)。
- 編寫(xiě)Task類(lèi),繼承自AsyncTask并在后臺(tái)使用OkHttp進(jìn)行網(wǎng)絡(luò)請(qǐng)求。請(qǐng)求的是自己編寫(xiě)的一個(gè)API網(wǎng)站(API的WEB服務(wù)搭建這里不做敘述,請(qǐng)求得到的是json格式數(shù)據(jù)。)。
- 請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)
- package com.zc.testforasynctask;import android.content.Context;import android.os.AsyncTask;import android.util.Log;import android.widget.TextView;import android.widget.Toast;import com.google.gson.Gson;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MyTask extends AsyncTask<String, String, Item> {private Context mContext;private TextView tv;public MyTask(Context mContext, TextView tv) {this.mContext = mContext;this.tv = tv;}@Overrideprotected void onPreExecute() {super.onPreExecute();Toast.makeText(mContext, "開(kāi)始尋找網(wǎng)絡(luò)資源", Toast.LENGTH_SHORT).show();}private String baseUrl = "http://13.250.1.159:8000/api/";@Overrideprotected Item doInBackground(String... strings) {Item result;try {Thread.sleep(0b1111101000);OkHttpClient client = new OkHttpClient();String nowUrl = baseUrl + "merchants/" + strings[0] + ".json";Request request = new Request.Builder().url(nowUrl).build();Response response = client.newCall(request).execute();if (response.isSuccessful()){result = parseItemJsonObject(response.body().string());Log.i("msg", result.getName());}else {Toast.makeText(mContext, "無(wú)結(jié)果", Toast.LENGTH_SHORT).show();return null;}}catch (Exception e){Toast.makeText(mContext, "網(wǎng)絡(luò)連接異常", Toast.LENGTH_SHORT).show();return null;}return result;}@Overrideprotected void onPostExecute(Item item) {super.onPostExecute(item);if(item != null){tv.setText(item.getName());}else {tv.setText("數(shù)據(jù)解析為空");}}private Item parseItemJsonObject(String jsonData) {// 解析Json對(duì)象try {if (jsonData != null) {//創(chuàng)建一個(gè)Gson對(duì)象Gson gson = new Gson();Item item = gson.fromJson(jsonData,Item.class);return item;}else {return null;}}catch (Exception e){e.printStackTrace();return null;}}}
- 請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)
- 主活動(dòng)進(jìn)行事件綁定和點(diǎn)擊事件注冊(cè)
- 代碼見(jiàn)GitHub
- 效果展示
- 補(bǔ)充說(shuō)明
- 具體代碼和環(huán)境配置見(jiàn)我的GitHub,歡迎star或者fork
- 歡迎指出優(yōu)化之處
總結(jié)
以上是生活随笔為你收集整理的安卓进阶系列-08异步加载AsynsTask使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web开发-Django初识及实战
- 下一篇: 机器学习-分类之决策树原理及实战