Android之HTTP網絡通訊--GET傳遞(二)

  根據上一篇寫的是實現了經過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類的一些比較基本的理解,但願可以對於大家有幫助,有什麼欠缺的地方,還望你們留言。

相關文章
相關標籤/搜索