zoukankan      html  css  js  c++  java
  • Android线程之AsyncTask

      在之前的博客中为大家分享过关于Android多线程处理,想必大家对于Android为什么要使用多线程已经有了清晰的认识,我就在简单唠两句,Android规定UI界面的更新必须在在主线程进行,对于访问网络的耗时操作必须在子线程中执行,所以如果你想成为一名真正的Android开发工程师,多线程是你的必修课。本篇带给大家关于Android为我们封装好的一个简单的线程类AsyncTask。

      AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.对于AsyncTask的详细介绍请大家查看:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html

      AsyncTask中Android为我们封装了四个方法,具体的介绍请看下图:

      

      看到这里你大概对于AsyncTask已经有了一定的认识,下面我将以一个进度条效果带领大家进一步了解它。

      我们的布局文件activity_main.xml没有太多的控件,仅仅一个水平进度条:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    
    </RelativeLayout>

      我们的主Activity:

    public class MainActivity extends Activity {
    
        private ProgressBar mProgressBar;
        private MyAsyncTask mTast;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
            mTast = new MyAsyncTask();//创建我们自定义的AsyncTask
            mTast.execute();
            
        }
    
        //防止我们重新打开时,线程出现等待
        @Override
        protected void onPause() {
            super.onPause();
            if(mTast != null && mTast.getStatus() == AsyncTask.Status.RUNNING){
                //cancel()方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。
                mTast.cancel(true);
            }
        }
        
        class MyAsyncTask extends AsyncTask<Void, Integer, Void>{
    
            //doInBackground()方法是AsyncTask中四个方法中唯一的不在主线程执行的方法
            @Override
            protected Void doInBackground(Void... arg0) {
                for(int i=0; i<100; i++){
                    if(isCancelled()){//判断cancel的状态
                        break;
                    }
                    publishProgress(i);
                    try {
                        Thread.sleep(300);//模拟网络加载
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }
            
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                if(isCancelled()){//判断cancel的状态
                    return;
                }
                mProgressBar.setProgress(values[0]);
            }
            
        }
        
    }

      代码上没有什么难点,关键部位已经为大家注释,大家如果还有疑问,请留言讨论。

      

  • 相关阅读:
    召开演示会议和总结会议
    召开每天的站立会议
    禅道管理中的项目管理--组织进行任务分解
    linux sort,uniq,cut,wc命令详解
    json2.js的用途(拯救IE)
    memcache的内存回收机制
    memcache内存分配机制
    Linux之Sed命令详解(总结一些实用例子)
    CentOS 设置网络(修改IP&修改网关&修改DNS)--update.14.08.15
    php中文字符串翻转
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4474741.html
Copyright © 2011-2022 走看看