07 线程异步
来源:互联网 发布:淘宝店铺托管是什么 编辑:程序博客网 时间:2024/06/06 01: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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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>>{/** * 在首次执行异步任务时 调用此方法 做初始化操作 */@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();//将进度条展示 并且设置进度 progressBar.setVisibility(View.VISIBLE);progressBar.setProgress(0);}/** * 在子线程中执行 做耗时操作 */@Overrideprotected 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 blocke.printStackTrace();}return null;}/** * 更新进度的方法 在doInBackground中 执行publishProgress(values) 将进度值发送给onProgressUpdate */@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);//更新下载进度progressBar.setProgress(values[0]);}/** * 在主线程中更新UI 在执行完doInBackground之后执行 onPostExecute */@Overrideprotected void onPostExecute(List<String> result) {// TODO Auto-generated method stubsuper.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时 执行此方法@Overrideprotected void onCancelled() {// TODO Auto-generated method stubsuper.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; }}
0 0
- 07 线程异步
- 异步线程
- 线程异步
- 线程异步
- 线程高级---异步线程
- 线程池和异步线程
- 线程 和异步委托
- AsyncTask activity异步线程
- C# 线程与异步
- 线程异步通信
- Android 异步线程 HandlerThread
- 线程同步异步概念
- Android AsyncTask异步线程
- 线程同步与异步
- Android AsyncTask异步线程
- 线程进程/同步异步
- 线程异步总结
- javascript单线程 异步
- eclipse一些设置
- javascript异步编程原理
- Shell 基本运算符
- 云计算市场价值爆发,两马之战日趋激烈
- 排序算法和查找算法
- 07 线程异步
- 使用python解决TSP(旅行商问题)
- 【我的Java之旅】之Java概述
- Struts2 chap02-03总结-Action设置数据
- sqlite3移植到ARM开发板
- 达内学习笔记——零初始化
- jackjson的使用
- linux内核ioremap映射的透切理解
- 51nod 1242 斐波那契数列的第N项(矩阵快速幂)