zoukankan      html  css  js  c++  java
  • 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类的一些比较基本的理解,希望能够对于你们有帮助,有什么欠缺的地方,还望大家留言。

  • 相关阅读:
    利用python对新浪微博用户标签进行分词并推荐相关用户
    企业微信公众平台建设指南
    微信5.0:可定制菜单栏、移动支付、公众账号付费订阅
    jquery 控件使用 讲解 连载
    网络那些事
    拒绝访问 无法删除文件的解决方法
    Ubuntu9.10下安装Maya8.5(Finish)
    Ubuntu 9.10 更新软件源列表
    [转载]PHP的Class分页
    PHP与Mysql的连接
  • 原文地址:https://www.cnblogs.com/bingbingliang-xiaomonv/p/5248629.html
Copyright © 2011-2022 走看看