根據上一篇寫的是實現了通過url介面將介面中的數據顯示出來,這次根據上一篇的基礎,進一步說明一下AsynTask的使用。 AsynTask類有幾個函數是大家必須知道的。 doInBackGround() onPreExecute() onPostExecute() onProgressUpdate(
根據上一篇寫的是實現了通過url介面將介面中的數據顯示出來,這次根據上一篇的基礎,進一步說明一下AsynTask的使用。
AsynTask類有幾個函數是大家必須知道的。
doInBackGround()
onPreExecute()
onPostExecute()
onProgressUpdate()
首先doInBackGround():必須的一個覆寫的方法,在doInBackGround()中主要是寫的一些後天的耗時的操作,比如資料庫的連接和對於伺服器介面的獲取。
onPreExecute():可以寫一些的提示語,他是在主線程中運行的。
onPostExecute():執行doInBackGround()中的返回結果。
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類的一些比較基本的理解,希望能夠對於你們有幫助,有什麼欠缺的地方,還望大家留言。