关闭

Android-AsyncTask初体验

标签: androidasynctask
225人阅读 评论(0) 收藏 举报
分类:

AsyncTask学习记录

AsyncTask介绍

  • 异步任务
  • 为了解决不能在主线程做耗时操作,不能在子线程更新UI
  • 是android提供的轻量级的异步类,简单,快捷

具体详细代码如下(布局过于简单这就不给出了)

public class MyAsyncTaskText extends Activity
{
    private TextView startText, progerssText, endText;
    private Button startBtn;
    private MyAsync myAsync;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startText = (TextView) findViewById(R.id.text1);
        progerssText = (TextView) findViewById(R.id.text2);
        endText = (TextView) findViewById(R.id.text3);
        startBtn = (Button) findViewById(R.id.button1);
        myAsync = new MyAsync();
        startBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
            //执行异步AsyncTask,并传入可变参数,它的doInBackground方法能收到
                myAsync.execute("a","b");
            }
        });
    }
        /**
     * 使用步骤
     * 1、写一个类继承自AsyncTask
     * 有三个范型
     * 1、请求参数的类型
     * 2、进度的类型
     * 3、返回结果的类型
     */
    class MyAsync extends AsyncTask<String, Integer, String>
    {
            /**
         * 相当于子线程的操作
         * 参数:String...     这叫可变参数(可以传0~n) 相当于一个数组
         * 在调用异步任务的时候传递过来的
         * 返回值   会将返回的结果返回到onPostExecute的方法中
         * 必须重写
         */
        @Override
        protected String doInBackground(String... params) {
            //用来处理字符串变化
            StringBuilder builder = new StringBuilder(Arrays.toString(params));
            int i = 0;
            while(builder.length() < 30)
            {
                //每隔0.2秒添加一个字符,并更新进程
                builder.append(i++);
                //更新进程,此时会自动调用onProgressUpdate方法
                publishProgress(i);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return builder.toString();
        }
        //这下面的三个方法都能更新UI
        //当异步任务开始执行的时候调用
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            startText.setText("开始执行异步操作");          
        }
                /**
         * 必须调用publishProgress(values)方法才能调用到onProgressUpdate方法
         * 当进度更新的时候调用
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progerssText.setText("当前进度 :" + values[0]);
        }
         /**  
     * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)  
     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置  
     */ 
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            endText.setText("异步操作执行结束\n result=" + result);
        }
    }
}

最终效果如下

最终效果图

我的感受

  • 现在我感觉这东西真是太好用了,只需覆写几个方法,就可以对线程当前状态进行观察,而且在onPreExecute、onProgressUpdate、onPostExecute中还能对UI控件进行操作
  • 这东西用来做进度条是再好不过的了
  • 结构很明了

想说的话

  • 博客坚持写,不管怎样,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们
  • 若内容有什么地方不对、不清楚,望吐槽,希望大家能一起快乐学习和成长
  • 来一句:有时候我们的想法会被否决,即便后来发现我们是对的,也不可存在怨恨情绪,或者说类似于“我老早就说过会这样,还不信”的话。不要让团队之间由此产生间隙,不要因为这点小事耿耿于怀、常常抱怨。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12271次
    • 积分:392
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    文章存档
    最新评论