一个从网络获取json的例子:
package com.qf.day07_asynctask_json;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import com.qf.day07_asynctask_json.utils.ParseJson;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnLoad,btnCancle;
private ProgressBar progressBar;
private Spinner spinner;
private MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnLoad = (Button) findViewById(R.id.btnLoad);
btnCancle = (Button) findViewById(R.id.btnCancle);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
spinner = (Spinner) findViewById(R.id.spinner);
//让进度条消失 并且此属性不占据空间
progressBar.setVisibility(View.GONE);
//下载数据
btnLoad.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//执行异步任务
myAsyncTask = new MyAsyncTask();
myAsyncTask.execute("http://m2.qiushibaike.com/article/list/suggest?page=1");
}
});
//取消下载
btnCancle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 停止异步任务 有时会有问题不建议使用<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
myAsyncTask.cancel(true);
}
});
}
/**
* 自定义一个异步任务
* 第一个参数是启动后台线程传入的可变参数
* 第二个是在后运行的时候传入给onProgressUpdate 的可变参数
* 第三个是后台线程的返回值 也是传入给onPostExecute的参数
* @author sxy
*
*/
public class MyAsyncTask extends AsyncTask<String, Integer, List<String>>{
/**
* 在首次执行异步任务时 调用此方法 做初始化操作
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//将进度条展示 并且设置进度
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(0);
}
/**
* 在子线程中执行 做耗时操作
*/
@Override
protected List<String> doInBackground(String... params) {
// TODO Auto-generated method stub
//下载数据Json字符串
try {
//获取json字符串请求地址
String jsonPath = params[0];
URL url = new URL(jsonPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
//设置请求头 压缩方法
connection.addRequestProperty("Accept-Encoding", "identity");
connection.setConnectTimeout(5*1000);
connection.connect();
//请求数据成功
if(connection.getResponseCode() ==200){
//获取数据的总的长度
long maxLen = connection.getContentLength();
//设置当前下载的数据长度
long curLen = 0;
InputStream inputStream = connection.getInputStream();
//每次读取的数据
byte[] buffer = new byte[1024];
//每次读取数据的长度
int len =0;
//存储获取的数据
StringBuffer sBuffer = new StringBuffer();
while((len = inputStream.read(buffer))!=-1){
sBuffer.append(new String(buffer,0,len));
//当前的进度值 = 当前读取的长度*100/总长度
curLen+=len;
int progress = (int) ((curLen*100)/maxLen);
//将进度值 发送到onProgressUpdate()方法
publishProgress(progress);
Thread.sleep(500);
}
//解析数据 返回数据
return ParseJson.ParsaJsonString(sBuffer.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 更新进度的方法 在doInBackground中 执行publishProgress(values) 将进度值发送给onProgressUpdate
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
//更新下载进度
progressBar.setProgress(values[0]);
}
/**
* 在主线程中更新UI 在执行完doInBackground之后执行 onPostExecute
*/
@Override
protected void onPostExecute(List<String> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//下载完隐藏进度条
progressBar.setVisibility(View.GONE);
if(result!=null&&result.size()>0){
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(MainActivity.this, android.R.layout.simple_spinner_item, result);
spinner.setAdapter(adapter);
}
}
//点击其他按钮 取消AsyncTask时 执行此方法
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();
}
}
}
工具类:
package com.qf.day07_asynctask_json.utils;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class ParseJson {
public static List<String> ParsaJsonString(String jsonStr){
List<String> list = new ArrayList<String>();
if(jsonStr!=null){
try {
JSONObject jsonObject = new JSONObject(jsonStr);
int err = jsonObject.getInt("err");
//err==0 有数据
if(err==0){
JSONArray jsonArray = jsonObject.getJSONArray("items");
for(int i=0;i<jsonArray.length();i++){
//获取J松数组中每个对象
JSONObject jsonObject2 = jsonArray.getJSONObject(i);
String content = jsonObject2.getString("content");
list.add(content);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
}