Android的异步任务AsyncTask

异步任务主要是进行耗时的操作(如下载,上传就是一个很耗时的操作),防止UI线程出现ANR现象(Application Not Response),在Android 中子线程不能直接更新UI线程的东西,,之前用的是Thread+Handler的方式来实现多线程的通信处理,,现在则是用Android提供的轻量级的异步任务工具AsyncTask,内部已经封装好Thread+Handler的线程通信机制
AsyncTask是一个模板,通过子类继承来实现相应的功能

  • Params : 任务启动时的输入参数,比如要访问的URL地址 ,可以设置为String类型
  • Progress : 任务执行过程中的进度,一般设置为Integer类型,表示当前处理进度
  • Result :任务执行完的结果参数 ,可以设置为String ,Boolean 类型
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;

/**
 * 利用简单的控件对AsyncTask的异步操作的方法描述,没具体的实现
 * 对onPreExecute() , doInBackground(String... params), onPostExecute(Boolean result),onProgressUpdate(Integer... values)方法的讲解
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public class downloadtask extends AsyncTask<String,Integer,Boolean>{
        @Override
        //在异步执行之前,(还是在主线程中) 可以进行ui操作
        protected void onPreExecute() {
            /**
             * button.setText();
             * textview.setText();
             * ProgressBar.setprogress()
             */
            super.onPreExecute();
        }

        @Override
        //在另外一个线性中处理事件
        /**
         * @params  传入的参数  params[i] 表示传入的多个参数中第i-1个参数
         * @return  结果
         */
        protected Boolean doInBackground(String... params) {
            /**
             * 通过条件判断来获取传入的参数值
             *
             * 接着可以通过获取的值url可以进行一些其他的操作
             */
            if(params!=null&&params.length>0){
                String url=params[0];
            }
            return true;
        }
        @Override
        protected void onPostExecute(Boolean result){
            //在主线程中,对执行结果的处理
            /**
             * button.setText(result? getString(R.string.download_finish) : getString(R.string.download_finish));
             * textView.setText(result? getString(R.string.download_finish) + mFilePath: getString(R.string.download_finish));
             */
        }
        @Override
        protected void onProgressUpdate(Integer... values){
            //收到进度,然后处理,也是在UI线程中
            if (values != null && values.length > 0) {
                /**
                 * ProgressBar.setProgress(values[0]);
                 */
        }
        }
    }
}

你可能感兴趣的:(Android)