AsyncTask 项目笔记记录

AsyncTask

目的:方便后台线程中操作后更新UI

实现:Thread和Handler进行了封装

实质:Handler异步消息处理机制

泛型参数:Params:doInBackground方法的参数类型;Progress:AsyncTask所执行的后台任务的进度类型;Result:后台任务的返回结果类型

UI操作:onPreExecute()  //此方法会在后台任务执行前被调用,用于进行一些准备工作 

              onPostExecute(Result result)  //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果

后台线程操作:doInBackground(Params… params) //此方法中定义要执行的后台任务

输入输出:Params,Result

进度显示:onProgressUpdate(Progress… values) //由publishProgress内部调用,表示任务进度更新

除了doInBackground方法由AsyncTask内部线程池执行外,其余方法均在主线程中执行

一个应用实例——屏幕补光测试

实现老化测试屏幕补光测试项,部分真实代码

    private static final String TAG = "RetinaFlashTestActivity";
    public static final int WHITE_FRAMELAYOUT_INVISIABLE_CODE = 0;    //隐藏白屏标记码
    public static final int WHITE_FRAMELAYOUT_VISIABLE_CODE = 1;    //显示白屏标记码
    public static final long RETINA_FLASH_TIME = 1200;    //补光时间
    public static final long RETINA_FLASH_INERVAL_TIME = 3000;    //间隔时间
    private RetinaFlashTask retinaFlashTask;    //屏幕补光测试AsyncTask异步任务

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.retina_flash);
        Log.d(TAG, "onCreate: true");
        UtilLog.d(TAG, "--------进入补光测试项");
        initTime(); //初始化测试时间和进入时间
        setActionBar(); //设置ActionBar无图标
        initView(); //初始化布局文件

        retinaFlashTask = new RetinaFlashTask();    //实例异步任务对象
        retinaFlashTask.execute(testTime);  //开始执行AsyncTask异步任务,传入测试时间参数
    }
    class RetinaFlashTask extends AsyncTask<Long, Integer, Boolean> {

        @Override
        protected void onPreExecute() { //AsyncTask异步任务开始前执行的操作,UI线程中
            Log.d(TAG, "onPreExecute: true");
            UtilLog.d(TAG, "--------补光测试异步任务开始前操作");
            super.onPreExecute();
            if (factory_mode) { //初始化结果报告内容
                str_report_prop = "f_str_" + getItemPropById(TEST_RETINAFLASH) + "_report";    //执行结果
                str_count_prop = getItemPropById(TEST_RETINAFLASH) + "_f_count";    //执行次数
            } else {
                str_report_prop = "str_" + getItemPropById(TEST_RETINAFLASH) + "_report";
                str_count_prop = getItemPropById(TEST_RETINAFLASH) + "_count";
            }
            editor.putLong(str_count_prop, 0);
            editor.commit();
        }

        @Override
        protected Boolean doInBackground(Long... longs) {   //AsyncTask异步任务异步执行的内容,子线程中
            Log.d(TAG, "doInBackground: true");
            UtilLog.d(TAG, "--------进入补光测试异步任务");
            while ((System.currentTimeMillis() - enterTime) < longs[0]) {   //测试时间内
                if (isCancelled()) {    //收到标志异步任务已经中断
                    editor.putLong(str_count_prop, count);	//提交次数结果
                    editor.commit();
                    editor.putString(str_report_prop, "FAIL");  //任务中断测试结果视为失败
                    editor.commit();
                    setRetinaFlash(false);  //异步任务结束前取消屏幕补光
                    return null;
                }
                try {
                    publishProgress(WHITE_FRAMELAYOUT_INVISIABLE_CODE); //发送隐藏白屏FrameLayout的消息
                    setRetinaFlash(false);  //取消屏幕补光
                    Thread.sleep(RETINA_FLASH_INERVAL_TIME);    //取消屏幕补光间隔
                    publishProgress(WHITE_FRAMELAYOUT_VISIABLE_CODE); //发送显示白屏FrameLayout的消息
                    setRetinaFlash(true);   //打开屏幕补光
                    Thread.sleep(RETINA_FLASH_TIME);    //打开屏幕补光时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                int remainTime = (int) (longs[0] - (System.currentTimeMillis() - enterTime)) / (60 * 1000); //计算剩余测试时间
                count++;    //计算测试次数
                publishProgress(remainTime, count); //发送remainTime, count更新UI
            }
            setRetinaFlash(false);  //异步任务结束前取消屏幕补光
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {    //进度更新
            super.onProgressUpdate(values);
            if (values != null && values.length == 1){  //接收到一个参数
                if (values[0] == WHITE_FRAMELAYOUT_VISIABLE_CODE) {   //补光显示白屏FrameLayout
                    whiteFrameLayout.setVisibility(View.VISIBLE);
                } else if (values[0] == WHITE_FRAMELAYOUT_INVISIABLE_CODE) {    //补光间隔隐藏白屏FrameLayout
                    whiteFrameLayout.setVisibility(View.INVISIBLE);
                }
            } else if (values != null && values.length > 1) {   //接收到两个个参数,更新UI
                String tmpStr = String.format(getString(R.string.remainder_times), values[0]);
                remainTimeTextView.setText(tmpStr);
                tmpStr = String.format(getString(R.string.tested_counts), values[1]);
                countTextView.setText(tmpStr);
            }
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            Log.d(TAG, "onPostExecute: true");
            super.onPostExecute(aBoolean);
            if ((System.currentTimeMillis() - enterTime) < testTime) {
                Log.d(TAG, "onPostExecute: TEST FAIL");
                UtilLog.d(TAG, "--------补光测试失败");
                editor.putLong(str_count_prop, count);	//提交次数结果
                editor.commit();
                editor.putString(str_report_prop, "FAIL");
                editor.commit();
                startMyActivity(RetinaFlashTestActivity.this, AgingTestActivityExt.class);
            } else {
                Log.d(TAG, "onPostExecute: TEST PASS");
                UtilLog.d(TAG, "--------补光测试成功");
                editor.putLong(str_count_prop, count);	//提交次数结果
                editor.commit();
                editor.putString(str_report_prop, "PASS");
                editor.commit();
            }
        }
    }
	
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: true");
        retinaFlashTask.cancel(true);   //设置中断AsyncTask异步任务
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值