Android线程总结笔记(1)——AsyncTask

        android中实现子线程的方法有很多,首先就说说AsyncTask,这是android特意为更新UI设置的后台线程类,用起来十分方便,不过也有一些缺点,如果线程加载太多很容易出问题,详情可见AsyncTask的缺陷http://www.oschina.net/question/54100_27825)。不过大部分时候用起来还是很不错的,因此对它先做一个总结

        最简单也最常用的就是后台更新加载数据或者其他耗时操作的进度条,我这里就以最简单的后台更新进度条为例进行一个示范,实现的功能就是点击按钮之后,初始化进度为0,然后子线程每秒钟进度增加百分之十,直到百分之百。代码中有详细的注释,这里不做过多说明。

    

public class ThreadStudyActivity extends Activity {
    /** Called when the activity is first created. */
	private ProgressBar progressBar;
	private Button button;
	private int progress;	//进度条进度
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        progressBar = (ProgressBar)findViewById(R.id.progressBar);
        progressBar.setVisibility(View.INVISIBLE);//先隐藏进度条
        
        button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(new Button.OnClickListener(){
        	@Override
        	public void onClick(View v){        		
        		new newTask().execute();	//启动子线程
        	}
        });
        
    }
    
    /**
     * 定义子线程类
     * 继承于AsyncTask,其中<String, Integer, Boolean>代表的含义为:
     * String:函数  doInBackground(String... params)的参数类型
     * Integer:函数onProgressUpdate(Integer... values)的参数类型
     * Boolean:函数doInBackground(String... params)的返回值,以及onPostExecute(Boolean result)的参数类型,两者要一致
     * 如果没有必要,以上三个参数也可以都定义为void
     * */
	private class newTask extends AsyncTask<String, Integer, Boolean> {
    	//
    	@SuppressWarnings("unused")
    	/**
    	 * 启动子线程前执行的函数,可以进行显示进度条,赋初值等操作
    	 * */
		protected void onPreExecute  (){
    		progress = 0;
    		progressBar.setVisibility(View.VISIBLE);	//显示进度条
    		progressBar.setProgress(progress);
    		Toast.makeText(ThreadStudyActivity.this, "子线程开始!", Toast.LENGTH_SHORT).show();
    	}
    	/**
    	 * 子线程后台执行的程序,此处放置耗时操作
    	 * 返回值同时作为onPostExecute(Boolean result)的参数
    	 * */
        protected Boolean doInBackground(String... params) {
        	for(int i=0;i<10;i++){
	        	try {
					Thread.sleep(1000);//延迟1秒钟
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        	progress += 10;
	        	publishProgress(progress);	//通知onProgressUpdate(Integer... values)函数进行更新UI,其中progress作为参数
        	}
        	
			return true;
        }
        //在子线程执行过程中更新UI,此处为更新进度条
        protected void onProgressUpdate(Integer... values) {
        	progressBar.setProgress(values[0]);
        }
        //子线程执行结束后,更新UI
		protected void onPostExecute(Boolean result) {
			if(result)
				Toast.makeText(ThreadStudyActivity.this, "子线程正常结束!", Toast.LENGTH_SHORT).show();
			progressBar.setVisibility(View.INVISIBLE);//隐藏进度条
         }
    }
}

贴上效果图:

1、点击按钮之前:


2、点击之后,子线程执行中:




end.......

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值