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