国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

android AsynTask處理返回?cái)?shù)據(jù)和AsynTask使用get,post請(qǐng)求

2019-12-12 04:04:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎ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ū)寫(xiě)。尤其是在異步處理結(jié)束之后,有回調(diào)函數(shù)進(jìn)行收尾處理。咳咳,程序員都懶的么

Android給我們提供的一個(gè)輕量級(jí)的用于處理異步任務(wù)的類(lèi):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)求返回不同類(lèi)型的數(shù)據(jù) 難道要一個(gè)類(lèi)型寫(xiě)個(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í)候要處理不同類(lèi)型的數(shù)據(jù)把這個(gè)Http設(shè)置泛型類(lèi)第三個(gè)參數(shù)返回值類(lèi)型設(shè)置為泛型不管你是什么類(lèi)型的數(shù)據(jù)全部ok

我又寫(xiě)了一個(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); } } //接口 類(lèi)似一個(gè)監(jiān)聽(tīng)事件 public interface OnResponseListener<T>{ void onResponse(T t); }}//獲取數(shù)據(jù)的測(cè)試類(lèi)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>(); //重寫(xiě)接口 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)求 必須大寫(xiě)  connection.setRequestMethod("GET");  //獲取網(wǎng)絡(luò)請(qǐng)求碼 200 400 500之類(lèi) 不懂百度  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){   //寫(xiě)入數(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("http://?"); 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 不寫(xiě)也可以  connection.setDoOutput(true);  connection.setDoInput(true);  os=connection.getOutputStream();  //把參數(shù)寫(xiě)入  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í)也希望多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴海县| 崇仁县| 垣曲县| 长寿区| 宜宾县| 莱阳市| 和林格尔县| 巴楚县| 双城市| 四川省| 凤山市| 道真| 淮滨县| 朝阳市| 文成县| 宜春市| 沁源县| 尉犁县| 邹城市| 英德市| 临安市| 合阳县| 六安市| 建平县| 远安县| 屏边| 麦盖提县| 聂拉木县| 苏尼特左旗| 镇宁| 乌兰县| 新源县| 石河子市| 汉沽区| 崇礼县| 临夏县| 敦化市| 泰兴市| 金湖县| 仙游县| 太湖县|