您的位置:首页 > 理论基础 > 计算机网络

Android之HTTP网络通信--GET传递(二)

2016-03-07 17:30 591 查看
根据上一篇写的是实现了通过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中有关的解释我都写在了代码注释中,代码如下

package com.example.httpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements HttpDataUrlListener,OnClickListener{

private HttpData httpdata;
private TextView tx;
private Button butn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx = (TextView)findViewById(R.id.txt);
butn = (Button)findViewById(R.id.btn);
//这个this自动识别OnClickListener接口
butn.setOnClickListener(this);

}

@Override
public void GetDataUrl(String data) {
// TODO Auto-generated method stub
System.out.println(data);
tx.setText(data);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn:
//这个this自动识别HttpDataUrlListener接口
httpdata = (HttpData) new HttpData("http://www.tuling123.com/openapi/api"
+ "?key=66530329be6f0110bcfb8dc06a4ddfff&info=今天天气怎么样"
+ "&loc=北京市中关村&userid=12345678",this
).execute();
break;

default:
break;
}
}

}


HttpData()中的代码如下:

package com.example.httpdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;
import android.widget.Toast;

public class HttpData extends AsyncTask<String, Float, String>{

//1.创建客户端
private HttpClient mhttpclient;
//2。指明传递的方法
private HttpGet mhttpget;
//3.做出回应
private HttpResponse mhttpresponse;
//4.创建实体
private HttpEntity mhttpentity;
//5.使用数据流进行数据的传输
private InputStream in;
//6.创建缓冲区
private BufferedReader br;
//7.储存所有的数据
private StringBuffer sb;

//声明接口
private HttpDataUrlListener listener;

private String url;

public HttpData(){
}
public HttpData(String url){
this.url = url;
}
public HttpData(String url,HttpDataUrlListener listener){
this.url = url;
this.listener = listener;
}

@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub

try {
//实例化一个客户端
mhttpclient = new DefaultHttpClient();
//使用get方法进行传递
mhttpget = new HttpGet(url);
//通过客户端进行发送
mhttpresponse = mhttpclient.execute(mhttpget);
//通过response方法获取实体
mhttpentity = mhttpresponse.getEntity();
long total = mhttpentity.getContentLength();
//通过流获取具体的内容
in = mhttpentity.getContent();
//创建缓冲区
br = new BufferedReader(new InputStreamReader(in));
String line = null;
sb = new StringBuffer();
while ((line = br.readLine())!=null){
sb.append(line);
//用于显示进度
publishProgress((float)sb.toString().length()/total);
}

return sb.toString();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
//这里是获取结果,将结果传给了接口,然后使用接口进行传递
//result也是AsyncTask中的最后一个参数
listener.GetDataUrl(result);
super.onPostExecute(result);
}

@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//        System.out.println("PreExecute");
}

@Override
protected void onProgressUpdate(Float... values) {
// TODO Auto-generated method stub
System.out.println(values[0]);
super.onProgressUpdate(values);
}

}


好了,上述就是我对于 AsynTask类的一些比较基本的理解,希望能够对于你们有帮助,有什么欠缺的地方,还望大家留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: