07 线程异步

原创 2016年08月30日 20:21:33

一个从网络获取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;
        
    }

}


版权声明:范明毅的个人博客,欢迎转载,转载请注明出处 举报

相关文章推荐

线程异步

[html] view plain copy print? private void executeAndWait(SimpleAsyncTaskExecutor exec...

Android UI线程异步调用

默认情况下,一个应用进程中只会有一个线程,就是UI线程,或者说是main线程。当用户需要执行比较耗时的操作,如图片下载、更新数据库等等,如果都在UI线程中实现的话,会造成UI进程的阻塞,影响用户体验。...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

线程,进程,线程同步,线程异步,相关概念学习——》总结

新年刚开工,有小伙伴准备面试,问我线程方面的东西,自己对于概念的东西也是很少去理解和总结,不觉中,学习软件这行已近三年,做Android开发已经一年了。懂的却是十分浅的东西,既然已经过去的时光,就不必...

Android线程异步处理之AsyncTask

Android应用是单线程模式的。 单线程模式需要记住两条: 一、防止UI线程阻塞 二、确保只在UI线程中访问Android UI工具包 在开发Android应用时必须遵守单线...

android线程异步处理之AsyncTask

android应用是单线程模式的。 单线程模式需要记住两条: 一、防止UI线程阻塞二、确保只在UI线程中访问Android UI工具包在开发Android应用时必须遵守单线程模型的原则:Android...

20170519Windows07_异步IO

异步IO机制 1:如果我们写的程序需要打开一个非常大的文件,我们使用的打开方式会打开很长时间才可以,可能需要数秒钟,文件越大,打开时间越长,在打开一些设备的时候,也可能发生阻塞,导致程序卡在这里,还可...

同步、异步电路 2012_07_28

异步电路主要是组合逻辑电路,用于产生地址译码器、FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变...

07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-按键驱动程序之异步通知机制+原子操作+互斥信号量+阻塞与非阻塞+定时器去抖

一、异步通知机制 从按键的实现方式来说,可以分为以下几种方式 查询方式,极度耗费CPU资源中断方式,平时休眠,按键按下,唤醒休眠poll机制,不需要一直read,根据poll返回值来决定是否rea...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)