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;  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;
        
    }

}


原文地址:https://www.cnblogs.com/muyuge/p/6152284.html