关闭

07 线程异步

5837人阅读 评论(0) 收藏 举报
分类:

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

}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

线程同步和异步区别 异步机制

1 区别同步和异步 举个简单的例子 就是游戏 游戏会有图像和背景音乐 图像是由玩家操作的 而背景音乐一般都是循环播放玩家不能操作 这里的图像和声音就分别是不同的线程 图像一般是主线程 背景音乐是守护线程(守护线程就是主线程结束的时候守护线程也结束) 像这样的组合就是异步线程 两个...
  • wxqian25
  • wxqian25
  • 2013-07-23 09:26
  • 11668

C#异步和线程

有几天没写博客了,挺忙的,没多少时间写!!最近在做一个App,对于菜鸟来说,那真是到处是坑!!!!     今天来看看线程和异步的问题: 1、 什么是线程和异步? 2、 线程和异步的区别? 3、 关于线程的点东西? 4、 关于异步的点东西?   ...
  • lichaoguan
  • lichaoguan
  • 2014-08-11 16:54
  • 1096

线程同步异步实例分析

我的理解: 同步就是顺序执行。 异步就是可以并行执行。 多线程是实现异步操作的一种手段或方式
  • fangqun663775
  • fangqun663775
  • 2015-06-12 11:16
  • 577

C#异步线程(二)Thread类

1、Thread类可以创建和控制线程。Thread构造函数进过重载可接受ThreadStart类或者ParameterizedThreadStart类型的委托参数。 2、ThreadStart委托接受的函数签名为:返回void,无参 3、在创建Thread对象之后,调用Start方法就可以启动线程 ...
  • YongYu_IT
  • YongYu_IT
  • 2015-03-27 09:23
  • 1486

线程、线程池、并发、同步、异步、锁

线程、线程池、并发、同步、异步、锁先看一个模拟多个线程同时写1000条日志例子:class Program { static void Main(string[] args) { Thread t1 = new Thread(Working); t1.Name ...
  • nowadaysall
  • nowadaysall
  • 2015-12-21 15:44
  • 1527

C# 多线程、异步线程、线程池相关知识

/* 线程池ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线程池时应立即启动的最小线程数, 以及线程池,中可用的最大线程数。如果有更多的作业要处理,线程池中线程...
  • smartsmile2012
  • smartsmile2012
  • 2016-09-10 21:27
  • 1014

Java --- 线程同步和异步的区别

1. Java 线程 同步与异步多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲系统处理...
  • u011033906
  • u011033906
  • 2016-12-23 15:23
  • 1084

java线程安全,同步,异步

线程是比进程更小的执行单位,是在进程基础上进行的进一步划分。所谓多线程是指进程在执行过程中可以产生多个同时存在、同时运行的线程。多进程机制可以合理利用资源,提高程序的运行效率。一个进程至少包含一个线程(JVM虚拟机的启动是多线程的,至少有两个线程:main 和垃圾回收机制)。 1、什么是线程安全? ...
  • Java_Zhangchao
  • Java_Zhangchao
  • 2016-08-09 12:44
  • 1526

第四章 ASP.NET中的线程与异步

4.1      线程基础 在Window3.1的时代,开始采用称为协同多任务的机制,实际上,Windows运行的多个程序并没有真的同时运行,每个程序都要在适当的时候释放CPU的控制权,以便其他的程序得到到执行的机会,这种机制称为协同。从Win...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2017-02-13 13:56
  • 546

Java多线程实现异步调用

在JAVA平台,实现异步调用的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获 取真正的数据.去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,...
  • dreamsunday
  • dreamsunday
  • 2016-03-09 21:20
  • 15751
    个人资料
    • 访问:480697次
    • 积分:6667
    • 等级:
    • 排名:第4161名
    • 原创:273篇
    • 转载:62篇
    • 译文:0篇
    • 评论:49条