• AsyncTask的简单使用


    耗时操作和更新UI结合,以前用过Handler。就是新开线程,处理耗时操作,然后通过发送信息,Handler在UI线程更新UI。

    Android提供一个已经封装好的类AsyncTask,我们只需重写它的几个方法就行。

    //在execute(Params... params)被调用后立即执行,在doInBackground之前调用,UI线程
    onPreExecute() 
    
    //当doInBackground结束时,此方法将会被调用,UI线程
    onPostExecute(Object o)
    
    
    //用于更新UI
    onProgressUpdate(Object[] values)
    
    //耗时操作,在执行过程中可以调用publishProgress来更新进度信息
    doInBackground(Object[] params)
    

    下面是一个例子。

    在MainActivity里面实例化一个自定义AsyncTask,然后开始执行。

    这个自定义的AsyncTask每隔5s使进度条增加10%

    布局文件(一个TextView,一个Button,一个进度条)

    <?xml version="1.0" encoding="utf-8"?>
    <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="com.example.administrator.test.MainActivity">
    
         <TextView
            android:id="@+id/textView01"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            />
    
        <ProgressBar
            android:id="@+id/progressBar02"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            style="@android:style/Widget.ProgressBar.Horizontal"
    
            android:layout_below="@+id/textView01"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="56dp" />
    
        <Button
            android:id="@+id/button03"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="更新progressbar"
            android:layout_marginTop="133dp"
            android:layout_below="@+id/textView01"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />
    
    </RelativeLayout>
    

    自定义的AsyncTask

    public class ProgressBarAsyncTask extends AsyncTask {
    
        private TextView textView;
        private ProgressBar progressBar;
    
    
        public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
            super();
            this.textView = textView;
            this.progressBar = progressBar;
        }
    
        //在execute(Params... params)被调用后立即执行,在后台操作之前调用,UI线程
        @Override
        protected void onPreExecute() {
            textView.setText("开始执行异步线程");
        }
    
        //当后台操作结束时,此方法将会被调用,UI线程
        @Override
        protected void onPostExecute(Object o) {
            textView.setText("异步操作执行结束");
        }
    
        //用于更新UI
        //有个很奇怪的问题 如果改了系统默认的参数,会导致调用失败,所以只能在这里面做一下类型转换
        //就是不能重载吧
        @Override
        protected void onProgressUpdate(Object[] values) {
    
           int temp =  Integer.parseInt(values[0]+"");
            Log.d("TAG",temp+"");
            progressBar.setProgress(temp);
        }
    
        //后台做的事情,耗时操作,在执行过程中可以调用publishProgress(Progress... values)来更新进度信息
        @Override
        protected Object doInBackground(Object[] params) {
    
            //5s加载10%
    
            for(int i=1;i<=10;i++){
    
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                Log.d("TAG",i+"");
    
                //在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
                publishProgress(i*10);
    
    
            }
    
            return null;
        }
    }
    

    MainActivity

    public class MainActivity extends AppCompatActivity {
    
        private Button button;
        private ProgressBar progressBar;
        private TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            button = (Button)findViewById(R.id.button03);
            progressBar = (ProgressBar)findViewById(R.id.progressBar02);
            textView = (TextView)findViewById(R.id.textView01);
    
            progressBar.setMax(100);
            progressBar.setProgress(0);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);
                    asyncTask.execute();
    
                }
            });
    
    
        }
    }

    效果

  • 相关阅读:
    usb mtp激活流程【转】
    [RK3288][Android6.0] USB OTG模式及切换【转】
    简单实用的磁带转MP3方法图解
    使用log4j的邮件功能
    hive从查询中获取数据插入到表或动态分区
    map和reduce 个数的设定 (Hive优化)经典
    Mysql ERROR 145 (HY000)
    Mysql计算时间差
    小米刷机教程和GAE for android
    Hbase 使用方法
  • 原文地址:https://www.cnblogs.com/wzben/p/6067506.html
Copyright © 2020-2023  润新知