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