07 线程异步
一个从网络获取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; } }