根據上一篇寫的是實現了經過url接口將接口中的數據顯示出來,此次根據上一篇的基礎,進一步說明一下AsynTask的使用。html
AsynTask類有幾個函數是你們必須知道的。java
doInBackGround()android
onPreExecute()數據庫
onPostExecute()apache
onProgressUpdate()api
首先doInBackGround():必須的一個複寫的方法,在doInBackGround()中主要是寫的一些後天的耗時的操做,好比數據庫的鏈接和對於服務器接口的獲取。服務器
onPreExecute():能夠寫一些的提示語,他是在主線程中運行的。app
onPostExecute():執行doInBackGround()中的返回結果。ide
onProgressUpdate():無返回值函數
AsynTask類的三個參數的講解,首先第一個參數是在主類中調用excute()方法的時候傳遞的參數。若是不須要參數的傳遞則將其設置爲Void類型。
第二個參數爲子線程中的執行過程,它的類型和onProgressUpdate()中的類型一致。
第三個參數爲返回值的類型,和doInBackground()方法的返回值類型還有onPostExecute()中的一致。
爲了測試這個軟件,我在上次的基礎上加了一個按鈕,點擊按鈕的時候就會返回Json數據, 而且還有進度的顯示
效果圖以下:
開始:
點擊獲取Json數據
進度條的顯示我是在logcat中顯示的,你也可讓其在手機上顯示
此次的代碼比上次有點改變,不過變化不大,我這裏就只給你們貼出MainActivity和HttpData這兩個類,至於接口就在上篇博文http://www.cnblogs.com/bingbingliang-xiaomonv/p/5247223.html中看吧
MainActivity中有關的解釋我都寫在了代碼註釋中,代碼以下
1 package com.example.httpdemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 public class MainActivity extends Activity implements HttpDataUrlListener,OnClickListener{ 11 12 private HttpData httpdata; 13 private TextView tx; 14 private Button butn; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 tx = (TextView)findViewById(R.id.txt); 21 butn = (Button)findViewById(R.id.btn); 22 //這個this自動識別OnClickListener接口 23 butn.setOnClickListener(this); 24 25 } 26 27 @Override 28 public void GetDataUrl(String data) { 29 // TODO Auto-generated method stub 30 System.out.println(data); 31 tx.setText(data); 32 } 33 34 @Override 35 public void onClick(View v) { 36 // TODO Auto-generated method stub 37 switch (v.getId()) { 38 case R.id.btn: 39 //這個this自動識別HttpDataUrlListener接口 40 httpdata = (HttpData) new HttpData("http://www.tuling123.com/openapi/api" 41 + "?key=66530329be6f0110bcfb8dc06a4ddfff&info=今每天氣怎麼樣" 42 + "&loc=北京市中關村&userid=12345678",this 43 ).execute(); 44 break; 45 46 default: 47 break; 48 } 49 } 50 51 52 53 }
HttpData()中的代碼以下:
1 package com.example.httpdemo; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 8 import org.apache.http.HttpEntity; 9 import org.apache.http.HttpResponse; 10 import org.apache.http.client.ClientProtocolException; 11 import org.apache.http.client.HttpClient; 12 import org.apache.http.client.methods.HttpGet; 13 import org.apache.http.impl.client.DefaultHttpClient; 14 15 import android.os.AsyncTask; 16 import android.widget.Toast; 17 18 public class HttpData extends AsyncTask<String, Float, String>{ 19 20 //1.建立客戶端 21 private HttpClient mhttpclient; 22 //2。指明傳遞的方法 23 private HttpGet mhttpget; 24 //3.作出迴應 25 private HttpResponse mhttpresponse; 26 //4.建立實體 27 private HttpEntity mhttpentity; 28 //5.使用數據流進行數據的傳輸 29 private InputStream in; 30 //6.建立緩衝區 31 private BufferedReader br; 32 //7.儲存全部的數據 33 private StringBuffer sb; 34 35 //聲明接口 36 private HttpDataUrlListener listener; 37 38 39 40 private String url; 41 42 public HttpData(){ 43 } 44 public HttpData(String url){ 45 this.url = url; 46 } 47 public HttpData(String url,HttpDataUrlListener listener){ 48 this.url = url; 49 this.listener = listener; 50 } 51 52 53 @Override 54 protected String doInBackground(String... params) { 55 // TODO Auto-generated method stub 56 57 try { 58 //實例化一個客戶端 59 mhttpclient = new DefaultHttpClient(); 60 //使用get方法進行傳遞 61 mhttpget = new HttpGet(url); 62 //經過客戶端進行發送 63 mhttpresponse = mhttpclient.execute(mhttpget); 64 //經過response方法獲取實體 65 mhttpentity = mhttpresponse.getEntity(); 66 long total = mhttpentity.getContentLength(); 67 //經過流獲取具體的內容 68 in = mhttpentity.getContent(); 69 //建立緩衝區 70 br = new BufferedReader(new InputStreamReader(in)); 71 String line = null; 72 sb = new StringBuffer(); 73 while ((line = br.readLine())!=null){ 74 sb.append(line); 75 //用於顯示進度 76 publishProgress((float)sb.toString().length()/total); 77 } 78 79 return sb.toString(); 80 } catch (ClientProtocolException e) { 81 // TODO Auto-generated catch block 82 e.printStackTrace(); 83 } catch (IOException e) { 84 // TODO Auto-generated catch block 85 e.printStackTrace(); 86 } 87 88 return null; 89 } 90 91 @Override 92 protected void onPostExecute(String result) { 93 // TODO Auto-generated method stub 94 //這裏是獲取結果,將結果傳給了接口,而後使用接口進行傳遞 95 //result也是AsyncTask中的最後一個參數 96 listener.GetDataUrl(result); 97 super.onPostExecute(result); 98 } 99 100 101 @Override 102 protected void onPreExecute() { 103 // TODO Auto-generated method stub 104 super.onPreExecute(); 105 // System.out.println("PreExecute"); 106 } 107 108 @Override 109 protected void onProgressUpdate(Float... values) { 110 // TODO Auto-generated method stub 111 System.out.println(values[0]); 112 super.onProgressUpdate(values); 113 } 114 115 }
好了,上述就是我對於 AsynTask類的一些比較基本的理解,但願可以對於大家有幫助,有什麼欠缺的地方,還望你們留言。