Android之HTTP网络通信--GET传递

Posted 冰冰凉@小魔女

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之HTTP网络通信--GET传递相关的知识,希望对你有一定的参考价值。

  根据上一篇写的是实现了通过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类的一些比较基本的理解,希望能够对于你们有帮助,有什么欠缺的地方,还望大家留言。

 

以上是关于Android之HTTP网络通信--GET传递的主要内容,如果未能解决你的问题,请参考以下文章

android网络框架OkHttp之get请求(源码初识)

android中的HttpUrlConnection的使用之五

iOS开发之HTTPS连接GET请求实现Body传递参数

Android网络通信之Socket

Android Studio之网络编程

HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection