zoukankan      html  css  js  c++  java
  • 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;
            
        }
    
    }
    


  • 相关阅读:
    [php]php设计模式 Interpreter(解释器模式)
    [php]php设计模式 Decorator(装饰模式)
    [php]php设计模式 Adapter(适配器模式)
    [php]php设计模式 Delegation(委托模式)
    [php]php设计模式 Builder(建造者模式)
    [python]django学习笔记 二
    [ruby]ruby on rails学习笔记1
    [php]php设计模式 Factory(工厂模式)
    pku3461 Oulipo (KMP)
    pku 2406 && pku 1961 Period && hdu3746 Cyclic Nacklace
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152284.html
Copyright © 2011-2022 走看看