实现异步任务的方法:
1.定义一个类,继承AsyncTask,同时声明三个泛型
public class MyTask extends AsyncTask<Params,Progress,Result>
没有返回类型:Void
第一个泛型:子线程执行任务的请求参数类型
第二个泛型:子线程执行任务的进度
第三个泛型:子线程执行任务的返回结果类型
2.重写核心的方法(4个)
-
onPreExecute()
运行在主线程中,负责初始化的工作 -
doInBackground(Params...)
运行在子线程中,执行耗时操作 -
onProgressUpdate(Progress...)
运行在主线程中,实时更新进度条 -
onPostExecute(Result)
运行在主线程中,更新UI(在doInBackground()方法执行后由系统自动调用)
3.启动异步任务(必须在主线程中启动)
new MyTask().execute(Params... params)
4.在主线程中取消异步任务
myTask.cancel(true)
实例:(通过异步任务在线解析json数据+ProgressBar)
/**
*解析json
*/
public class ParseJson {
public static List<String> parseJson(String jsonStr) throws JSONException {
// TODO Auto-generated method stub
List<String> data=new ArrayList<String>();
if (jsonStr!=null) {
JSONObject object=new JSONObject(jsonStr);
JSONArray array=object.getJSONArray("items");
for(int i=0;i<array.length();i++){
JSONObject object2=array.getJSONObject(i);
String content=object2.getString("content");
data.add(content);
}
}
return data;
}
}
异步操作:
public class MainActivity extends Activity {
private ProgressBar pb;
private Button btn1,btn2;
private Spinner sp;
private String path="http://m2.qiushibaike.com/article/list/suggest?page=1";
private MyTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pb=(ProgressBar) findViewById(R.id.prog);
sp=(Spinner) findViewById(R.id.spinner);
}
public void show(View v){
switch (v.getId()) {
case R.id.start:
//开启异步任务 下载内容
task=new MyTask();
task.execute(path);
break;
case R.id.stop:
//停止异步任务
task.cancel(true);
break;
}
}
public class MyTask extends AsyncTask<String, Integer,List<String>>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
//当前进度值=0
pb.setProgress(0);
}
@Override
protected List<String> doInBackground(String... params) {
// TODO Auto-generated method stub
try {
//向网络获取数据
URL url=new URL(params[0]);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
//请求数据时不能以压缩方式返回
connection.setRequestProperty("Accept-Encoding","identity");
if (connection.getResponseCode()==200) {
InputStream is=connection.getInputStream();
//得到数据的总长度
long maxLen=connection.getContentLength();
//得到数据的当前的加载长度
long curLen=0;
//读取数据
byte[] buffer=new byte[1024];
int len=0;
StringBuilder sBuilder=new StringBuilder();
while ((len=is.read(buffer))!=-1) {
sBuilder.append(new String(buffer,0,len));
//计算出当前加载的进度值
//int pb=(int)(当前加载的长度*100/总长度 ) 百分比
curLen+=len;
int progress=(int)(curLen*100/maxLen);
//更新进度条 异步更新进度条(onProgressUpdata(Integer...values))
publishProgress(progress);
Thread.sleep(1000);
}
//解析json数据 List<String>
return ParseJson.parseJson(sBuilder.toString());
}
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO 实时更新进度条
super.onProgressUpdate(values);
pb.setProgress(values[0]);
}
@Override
protected void onPostExecute(List<String> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//让进度条消失
pb.setVisibility(View.GONE);
if (result!=null&& result.size()>0) {
ArrayAdapter<String> adapter =new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_spinner_item,result);
sp.setAdapter(adapter);
}else {
Toast.makeText(MainActivity.this,"获取失败", Toast.LENGTH_SHORT).show();
}
//通过适配器 将获取到的数据填充到Spinner中
}
}
}