android异步处理简单总结

android异步处理有两种方法:一种是Thread+Handler;另一种是使用android提供的异步处理类AsyncTask。

一、Thread+Handler方法的使用方法大致如下:

  1. 创建Handler对象,并重写其handleMessage(Message)方法。                                                                                                                                                                                                              
    private ProgressDialog pd;
    	private Handler handler = new Handler(){
    		@Override
    		public void handleMessage(Message msg) {
    			if(msg.what == LOAD_DATA_COMPLEMENT_CODE){
    				initComponent();
    				pd.dismiss();
    			}
    		}
    	};
  2. 创建一个非UI线程在它的run方法中执行耗时操作,执行完耗时操作后再使用Handler对象更新UI线程。
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    		setContentView(R.layout.website_query);
    		
    		/*初始化*/
    		/*注:使用线程需注意不能在非主线程中操作UI组件*/
    		new Thread(){
    			@Override
    			public void run() {
    				loadData();//耗时操作
    				/*数据加载完后通知初始化UI组件*/
    				Message msg = new Message();
    				msg.what = LOAD_DATA_COMPLEMENT_CODE;
    				handler.sendMessage(msg);
    			}
    		}.start();
    		
    		pd = new ProgressDialog(this);
    		pd.setTitle("数据加载中,请稍后...");
    		pd.show();
    	}

  1. 二、使用AsyncTash类的使用方法为:
  1. 	private class InitData extends AsyncTask<Void, Void, Void> {
    	
    
    		@Override
    		protected Void doInBackground(Void... params) {
    			Log.e(TAG,"  AsyncTask doInBackground() was called here.....");
    			SelectFlightCityActivity.citiesList = loadCityData();
    			return null;
    		}
    		
    		@Override
    		protected void onPreExecute() {
    			// TODO Auto-generated method stub
    			super.onPreExecute();
    			Log.e(TAG,"  AsyncTask onPreExecute() was called here.....");
    		}
    		 
    		@Override
    		protected void onCancelled() {
    			// TODO Auto-generated method stub
    			super.onCancelled();
    		}
    
    		@Override
    		protected void onProgressUpdate(Void... values) {
    			// TODO Auto-generated method stub
    			super.onProgressUpdate(values);
    		}
    
    		@Override
    		protected void onPostExecute(Void result) {
    			// TODO Auto-generated method stub
    			super.onPostExecute(result);
    			Log.e(TAG,"  AsyncTask onPostExecute() was called here.....");
    			try {
    				Thread.sleep(2000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			Intent intent = new Intent(InitActivity.this, MainActivity.class);
    			startActivity(intent);
    			finish();
    		}
    	 }

    PS:1、AsyncTask类本质上是创建一个静态线程池,执行完操作后,再通过Handler跟UI线程进行交互。所以本质上也是Handler的异步处理。
  1. 2、AsyncTask的onProgressUpdate()方法可以用来更新进度条。onProgressUpdate()方法在doInbackground()方法中调 用publishProgress()方法后调用,如下:
  1. 	@Override  
            protected Bitmap doInBackground(String... params) {//处理后台执行的任务,在后台线程执行   
                publishProgress(0);//将会调用onProgressUpdate(Integer... progress)方法   
                HttpClient hc = new DefaultHttpClient();  
                publishProgress(30);  
                HttpGet hg = new HttpGet(params[0]);//获取csdn的logo   
                final Bitmap bm;  
                try {  
                    HttpResponse hr = hc.execute(hg);  
                    bm = BitmapFactory.decodeStream(hr.getEntity().getContent());  
                } catch (Exception e) {  
                      
                    return null;  
                }  
                publishProgress(100);  
                //mImageView.setImageBitmap(result); 不能在后台线程操作ui   
                return bm;  
            }  
              
            protected void onProgressUpdate(Integer... progress) {//在调用publishProgress之后被调用,在ui线程执行   
                mProgressBar.setProgress(progress[0]);//更新进度条的进度   
             }

  1. 我在这里写得很简单,这里有几篇文章对Handler和AsyncTask有详细的描述: http://www.linuxidc.com/Linux/2011-09/43146.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值