android AsynTask處理返回?cái)?shù)據(jù)和AsynTask使用get,post請(qǐng)求
Android是一個(gè)單線程模型,Android界面(UI)的繪制都只能在主線程中進(jìn)行,如果在主線程中進(jìn)行耗時(shí)的操作,就會(huì)影響UI的繪制和事件的響應(yīng)。所以在android規(guī)定,不可在主線中進(jìn)行耗時(shí)操作,否則將發(fā)生程序無(wú)響應(yīng)(ANR)問(wèn)題。
解決辦法:開(kāi)啟新的線程進(jìn)行耗時(shí)操作
開(kāi)啟新的線程可以new Thread() 或?qū)崿F(xiàn)Runnable接口
什么要使用AsyncTask呢?
如果是使用Thread的run()方法,run()結(jié)束之后沒(méi)有返回值。所以必須要自己建立通信機(jī)制
AsyncTask將所有的線程通信都封裝成回調(diào)函數(shù),調(diào)用邏輯容易書(shū)寫。尤其是在異步處理結(jié)束之后,有回調(diào)函數(shù)進(jìn)行收尾處理??瓤?,程序員都懶的么
Android給我們提供的一個(gè)輕量級(jí)的用于處理異步任務(wù)的類:AsyncTask 當(dāng)然是那個(gè)簡(jiǎn)單就用那個(gè)咯
最后還有一點(diǎn)就是:Android 4.0后禁止在UI線程中執(zhí)行網(wǎng)絡(luò)操作~不然會(huì)報(bào):android.os.NetworkOnMainThreadException
什么是AsyncTask(原諒寶寶偷的圖 嘿嘿 不過(guò)真的解釋的很清楚呢)
注意:
Task的實(shí)例必須在UI Thread中創(chuàng)建
execute方法不惜在UI thread中創(chuàng)建
task只能被執(zhí)行一次 多次調(diào)用時(shí)會(huì)出現(xiàn)異常
通用AsyncTask 以及在主線程中使用網(wǎng)絡(luò)請(qǐng)求回返的數(shù)據(jù)
通用AsyncTask是什么意思呢 發(fā)送不同的請(qǐng)求返回不同類型的數(shù)據(jù) 難道要一個(gè)類型寫個(gè)AsyncTask 豈不是麻煩死咯
還有一種情況 我們通過(guò)異步任務(wù)得到了一個(gè)對(duì)象然后在一下行立刻使用這個(gè)對(duì)象邏輯完全沒(méi)問(wèn)題但是運(yùn)行之后會(huì)報(bào)空指針異常。這是怎么回事呢?
AsycnTask開(kāi)始了一個(gè)新的線程,但是主線程并沒(méi)有停止還在繼續(xù)運(yùn)行,馬上就使用這個(gè)對(duì)象,而你新開(kāi)的線程可能正在訪問(wèn)網(wǎng)絡(luò)這個(gè)對(duì)象為空
你無(wú)法確定AsycnTask什么時(shí)候才能獲取到數(shù)據(jù),網(wǎng)快嗖的一下就好了,網(wǎng)慢就要等好久。
看一個(gè)簡(jiǎn)略的小例子
首先呢 我們使用異步任務(wù)的時(shí)候要處理不同類型的數(shù)據(jù)把這個(gè)Http設(shè)置泛型類第三個(gè)參數(shù)返回值類型設(shè)置為泛型不管你是什么類型的數(shù)據(jù)全部ok
我又寫了一個(gè)接口作為Http的屬性 在onPostExecute方法調(diào)用其中的onResponse方法在Test中實(shí)現(xiàn)接口
這個(gè)接口的作用完全可以理解為一個(gè)監(jiān)聽(tīng)事件 checkbox的改變監(jiān)聽(tīng)觸發(fā)條件是 是否選中這個(gè)接口監(jiān)聽(tīng)是否有數(shù)據(jù) 完成網(wǎng)絡(luò)訪問(wèn)有數(shù)據(jù)的時(shí)候就調(diào)用
我們?cè)谥骶€程中完成接口的實(shí)現(xiàn)已經(jīng)在主線程中實(shí)現(xiàn)了返回來(lái)的數(shù)據(jù)還不是任君宰割阿~~~~~
public class Http<T> extends AsyncTask<String,Void,T> { private OnResponseListener<T> listener; public void setListener(OnResponseListener<T> listener) { this.listener = listener; } @Override protected T doInBackground(String... params) { return null; } @Override protected void onPostExecute(T t) { super.onPostExecute(t); if (listener!=null){ listener.onResponse(t); } } //接口 類似一個(gè)監(jiān)聽(tīng)事件 public interface OnResponseListener<T>{ void onResponse(T t); } } //獲取數(shù)據(jù)的測(cè)試類 public class Test { //要獲取的user對(duì)象 private User user1=null; public void get(){ //創(chuàng)建網(wǎng)絡(luò)訪問(wèn)實(shí)例 Http<User> http=new Http<User>(); //重寫接口 http.setListener(new Http.OnResponseListener<User>() { @Override public void onResponse(User user) { user1=user; } }); http.execute("xxx.balabala.com"); } }
在發(fā)送請(qǐng)求的時(shí)候很容易就帶個(gè)參數(shù),請(qǐng)求的方式呢 無(wú)非就是get,post 兩者的區(qū)別呢大白話的說(shuō)get不安全參數(shù)通過(guò)url直接傳過(guò)去post安全參數(shù)加密一下子
下面貼一下AsyncTask在get和post請(qǐng)求時(shí)核心代碼doInBackground方法
GET
protected T doInBackground(String... params) { //網(wǎng)絡(luò)連接對(duì)象 HttpURLConnection connection=null; //輸入流 獲取網(wǎng)絡(luò)數(shù)據(jù) InputStream is=null; //字節(jié)數(shù)組輸出流 ByteArrayOutputStream bos=null; try { //獲取網(wǎng)絡(luò)連接對(duì)象 connection=(HttpURLConnection) new URL(params[0]).openConnection(); //設(shè)置get請(qǐng)求 必須大寫 connection.setRequestMethod("GET"); //獲取網(wǎng)絡(luò)請(qǐng)求碼 200 400 500之類 不懂百度 int code=connection.getResponseCode(); if(code==200){ //獲取流 is=connection.getInputStream(); //臨時(shí)字節(jié)數(shù)組 byte [] b=new byte[1024]; int len=-1; bos=new ByteArrayOutputStream(); while ((len=is.read(b))!=-1){ //寫入數(shù)據(jù) bos.write(b,0,len); } String json=bos.toString("utf-8"); T t=JSON.parseObject(json,type); return t; }else{ Log.e("error","網(wǎng)絡(luò)訪問(wèn)失敗==========="+code); } } catch (IOException e) { e.printStackTrace(); }finally { try { if (bos!=null){ bos.close(); } if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } if (connection!=null){ connection.disconnect(); } } return null; }
POST
post和get的區(qū)別 就是post多了一段處理參數(shù)的代碼
protected T doInBackground(String... params) { //分割url 分為地址和參數(shù)兩部分 String[] strArr=params[0].split("\\?"); HttpURLConnection connection=null; //輸出流 OutputStream os=null; //輸入流 InputStream is=null; ByteArrayOutputStream bos=null; try { connection=(HttpURLConnection) new URL(strArr[0]).openConnection(); connection.setRequestMethod("POST"); //設(shè)置允許輸入 輸出 默認(rèn)值true 不寫也可以 connection.setDoOutput(true); connection.setDoInput(true); os=connection.getOutputStream(); //把參數(shù)寫入 os.write(strArr[1].getBytes("utf-8")); os.close(); int code=connection.getResponseCode(); if(code==200){ is=connection.getInputStream(); byte [] b=new byte[1024]; int len=-1; bos=new ByteArrayOutputStream(); while ((len=is.read(b))!=-1){ bos.write(b,0,len); } String json=bos.toString("utf-8"); T t=JSON.parseObject(json,type); return t; }else{ Log.e("error","網(wǎng)絡(luò)訪問(wèn)失敗==========="+code); } } catch (IOException e) { e.printStackTrace(); }finally { try { if (bos!=null){ bos.close(); } if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } if (connection!=null){ connection.disconnect(); } } return null; }
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- 詳解Android:向服務(wù)器提供數(shù)據(jù)之get、post方式
- Android中post和get的提交方式【三種】
- Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法
- Android中使用HttpURLConnection實(shí)現(xiàn)GET POST JSON數(shù)據(jù)與下載圖片
- android平臺(tái)HttpGet、HttpPost請(qǐng)求實(shí)例
- android使用url connection示例(get和post數(shù)據(jù)獲取返回?cái)?shù)據(jù))
- Android發(fā)送GET與POST請(qǐng)求的DEMO詳解
- android之HttpPost&HttpGet使用方法介紹
- Android HttpClient GET或者POST請(qǐng)求基本使用方法
- 安卓GET與POST網(wǎng)絡(luò)請(qǐng)求的三種方式
相關(guān)文章
Android中的android:layout_weight使用詳解
layout_weight的作用是設(shè)置子空間在LinearLayout的重要度(控件的大小比重)。layout_weight的值越低,則控件越重要,下面為大家介紹下具體的使用方法2013-06-06Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度
本篇文章主要介紹了Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07android開(kāi)發(fā)之方形圓角listview代碼分享
我寫這篇文章受到了kiritor的專欄發(fā)表的博文Android UI控件之ListView實(shí)現(xiàn)圓角效果的啟發(fā)。2013-06-06Kotlin實(shí)現(xiàn)圖片選擇器的關(guān)鍵技術(shù)點(diǎn)總結(jié)
這篇文章主要給大家介紹了關(guān)于Kotlin實(shí)現(xiàn)圖片選擇器的一些關(guān)鍵技術(shù)點(diǎn),這是一個(gè)我在學(xué)習(xí)Kotlin過(guò)程中的一個(gè)練手項(xiàng)目,非常適合學(xué)習(xí)Kotlin的時(shí)候參考,需要的朋友可以參考下2021-09-09新版Android Studio3.6找不到R.java怎么處理
這篇文章主要介紹了新版Android Studio3.6找不到R.java怎么處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03android中TabHost的圖標(biāo)(48×48)和文字疊加解決方法
開(kāi)發(fā)過(guò)程中,有時(shí)候圖標(biāo)稍微大點(diǎn),比如48×48的時(shí)候,文字就會(huì)和圖標(biāo)疊加起來(lái),遇到這種問(wèn)題我們?cè)撛鯓犹幚砟??本文將詳?xì)介紹希望對(duì)你有所幫助2013-01-01Android 判斷網(wǎng)絡(luò)狀態(tài)實(shí)例詳解
這篇文章主要介紹了Android 判斷網(wǎng)絡(luò)狀態(tài)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04android獲取當(dāng)前手機(jī)號(hào)示例程序
這篇文章主要介紹了android如何獲取當(dāng)前手機(jī)號(hào)的方法,大家參考使用吧2013-11-11