AsyncTask的学习

一周没学习,累觉不爱,周一新刀到手,结果就把手指给切了5MM深1cm宽,直接缝了四针,真是痛苦到极点了!隔一天还得换次药,现在总算不是太影响敲代码了,感觉有点为自己开脱的感觉。花了300多,一周时间,真的很不划算,开始敲代码吧。。


AsyncTask的学习

AsyncTask就是对Handler和Thread的封装,简化了一些操作

常见的方法有四个:
onPreExecute(); 执行在主线程中,异步任务前开始前调用.
doInBackground();执行在子线程中,异步任务的过程中调用.
onPostExecute();执行在主线程中,任务完成后调用.
onProgressUpdate();执行在主线程中,在执行过程中操作进度的改变.


/**
 *   异步下载demo
 *   1:准备权限相关:  网络权限  读写存储设备权限
 *   2: 界面 Layoout
 *   3:下载前要做的事情
 *   4:下载中要做的事情
 *   5:下载完成后要做的事情
 */

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static final int INIT_PROGRESS = 0;
    private static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
    private static final String APK_NAME = "aaaa.apk";
    private ProgressBar mProgressBar;
    private Button mButton;
    private TextView mDwonLoadText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initListener();
    }

    private void initView() {
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mButton = (Button)findViewById(R.id.button);
        mDwonLoadText = (TextView)findViewById(R.id.tv_download);
    }

    private void initData() {
        mProgressBar.setProgress(INIT_PROGRESS);//设置进度
        mButton.setText(R.string.click_dwonload);
        mDwonLoadText.setText(R.string.click_dwonload);
    }

    private void initListener() {
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击开始下载....执行耗时操作
                DwonloadAsyncTask dwonloadAsyncTask = new DwonloadAsyncTask();
                //传入的参数。。 可以是任何参数  这里一般传入url地址
                dwonloadAsyncTask.execute(APK_URL);
            }
        });
    }

    /**
     *  String 参入的参数
     *  Integer 进度条的进度
     *  Boolean  返回值
     */
    class DwonloadAsyncTask extends AsyncTask<String,Integer,Boolean>{

        //获取文件存储的路径
        String apkPash = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;

        /**
         * 此方法执行在子线程中,是AsnycTask执行的开始方法,在异步任务之前执行
         * 一般用来操作ui
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 此方法执行在子线程中,是AsnycTask的执行过程中的方法
         * @param params 入参
         * @return  出参
         */
        @Override
        protected Boolean doInBackground(String... params) {
            if (params!=null && params.length>0){
                //接受params传入进来的参数
                String apkUrl = params[0];
                try {
                    //创建URL
                    URL url = new URL(apkUrl);
                    //创建连接 并打开
                    URLConnection conn = url.openConnection();
                    //获取url的一些参数
                    //连接文件的总大小
                    int contentLength = conn.getContentLength();
                    //获取文件的输入流
                    InputStream is = conn.getInputStream();
                    //获取文件存储的路径
                    String apkPash = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;
                    File file = new File(apkPash);
                    //对文件路径做下处理
                    if(file.exists()){
                        //如果不为空删除文件
                        file.delete();
                    }

                    //记录已经下载的大小
                    int downLoadSize =0;
                    //记录每次下载大小
                    int len = 0;
                    //每次下载多少字节
                    byte[] bytes = new byte[1024];
                    //创建文件输出流管道
                    OutputStream os = new FileOutputStream(apkPash);
                    //开始下载文件
                    while ((len = is.read(bytes)) != -1){
                        //记录每次下载的进度
                        downLoadSize += len;
                        os.write(bytes,0,len);
                        //处理进度条 抛出进度
                        publishProgress(downLoadSize*100 /contentLength);
                    }
                    os.close();
                    is.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return true;
            }else{
                return  false;
            }
        }

        /**
         * 此方法执行在主线程中,在异步任务执行完后
         * 一般用来操作结果
         * @param b
         */
        @Override
        protected void onPostExecute(Boolean b) {
            //更新UI
            mButton.setText(b?"下载完成":"下载失败");
            mDwonLoadText.setText(b?"下载完成"+apkPash:"下载失败");
        }

        /**
         * 在执行过程中操作进度的改变
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            if(values !=null && values.length>0){
                //接受进度
                Integer value = values[0];
                //更新进度条
                mProgressBar.setProgress(value);
            }
        }
    }


}

简单封装下步骤


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static final int INIT_PROGRESS = 0;
    private static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
    private static final String APK_NAME = "aaaa.apk";
    private ProgressBar mProgressBar;
    private Button mButton;
    private TextView mDwonLoadText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initListener();

    }

    private void initView() {
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mButton = (Button)findViewById(R.id.button);
        mDwonLoadText = (TextView)findViewById(R.id.tv_download);
    }

    private void initData() {
        mProgressBar.setProgress(INIT_PROGRESS);//设置进度
        mButton.setText(R.string.click_dwonload);
        mDwonLoadText.setText(R.string.click_dwonload);
    }

    private void initListener() {
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取文件存储的路径
                final String apkPath = Environment.getExternalStorageDirectory()+File.separator+ APK_NAME +File.separator;
                mButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        DwonLoadHelper.dwonLoad(APK_URL, apkPath, new DwonLoadHelper.OnDownLoadListener() {
                            @Override
                            public void onStart() {
                                mButton.setText("正在下载");
                                mDwonLoadText.setText("正在下载");
                            }

                            @Override
                            public void onSuccess(int code, File file) {
                                mButton.setText("下载完成");
                                mDwonLoadText.setText("下载完成"+apkPath);
                            }

                            @Override
                            public void onFail(int code, File file, String message) {
                                Log.i(TAG,message);
                            }
                            @Override
                            public void onProgress(int progress) {
                                mProgressBar.setProgress(progress);
                            }
                        });
                    }
                });
            }
        });
    }



}
----------


----------


/**
 *  对AsyncTask异步下载的简单封装
 *  定义下载方法,传入必要的url path  listener参数  在AsyncTask里进行回调
 *  定义接口
 */
public class DwonLoadHelper {

    public static void dwonLoad(String url ,String FilePath,OnDownLoadListener listener){
        DwonloadAsyncTask dwonloadAsyncTask = new DwonloadAsyncTask(url,FilePath,listener);
        dwonloadAsyncTask.execute();
    }

    static class DwonloadAsyncTask extends AsyncTask<String,Integer,Boolean> {
        public String mUrl;
        public String mFilePath;
        public OnDownLoadListener mListener;

        public DwonloadAsyncTask(String mUrl, String mFilePath, OnDownLoadListener mListener) {
            this.mUrl = mUrl;
            this.mFilePath = mFilePath;
            this.mListener = mListener;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if(mListener !=null){
                mListener.onStart();
            }
        }
        @Override
        protected Boolean doInBackground(String... params) {
                if(mListener!=null){
                    try {
                        //创建URL
                        URL url = new URL(mUrl);
                        //创建连接 并打开
                        URLConnection conn = url.openConnection();
                        //连接文件的总大小
                        int contentLength = conn.getContentLength();
                        //获取文件的输入流
                        InputStream is = conn.getInputStream();
                        File file = new File(mFilePath);
                        //对文件路径做下处理
                        if(file.exists()){
                            //如果不为空删除文件
                            file.delete();
                        }
                        //记录已经下载的大小
                        int downLoadSize =0;
                        //记录每次下载大小
                        int len = 0;
                        //每次下载多少字节
                        byte[] bytes = new byte[1024];
                        //创建文件输出流管道
                        OutputStream os = new FileOutputStream(mFilePath);
                        //开始下载文件
                        while ((len = is.read(bytes)) != -1){
                            //记录每次下载的进度
                            downLoadSize += len;
                            os.write(bytes,0,len);
                            //处理进度条 抛出进度
                            publishProgress(downLoadSize*100 /contentLength);
                        }
                        os.close();
                        is.close();
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return true;
                }else{
                    mListener.onFail(-2,new File(mFilePath),"文件下载失败");
                    return  false;
                }
        }

        /**
         * 此方法执行在主线程中,在异步任务执行完后
         * 一般用来操作结果
         * @param b
         */
        @Override
        protected void onPostExecute(Boolean b) {
            //更新UI
            if(mListener !=null){
                mListener.onSuccess(1,new File(mFilePath));
            }else{
             mListener.onFail(-1,new File(mFilePath),"文件下载失败");
            }
        }

        /**
         * 在执行过程中操作进度的改变
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            if(values !=null && values.length>0){
                //接受进度
                Integer value = values[0];
                if(mListener!=null){
                    mListener.onProgress(value);
                }
            }
        }
    }

    /**
     * 定义接口,定义必要的一些方法回调
     */
    public interface OnDownLoadListener {
        void onStart();
        void onSuccess (int code ,File file);
        void onFail(int code, File file, String message);
        void onProgress(int progress);
        //对接口简单的小优化。有时候不需要用到那么多方法,只定义几个必须要用到的就可以了
        //只用成功失败的方法话,在接口调用时,用此类即可
        abstract class SimpleDwonLoad implements OnDownLoadListener{
            @Override
            public void onSuccess(int code, File file) {
            }
            @Override
            public void onFail(int code, File file, String message) {
            }
        }
    }

}

对接口的回调和写法有了一点了解,
可以把一些逻辑代码封装调用接口里的方法处理结果,让回调者在外面处理业务逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Resource Page Description 在以前的文章中,我曾多次强调应用程序中异步化的重要性。尤其对于IO密集型操作,异步执行对于应用程序的响应能力和伸缩性有非常关键的影响。正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即时异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量采用。其原因有很多,其中最主要的一点可能就是异步模型在编程较为困难,导致许多开发人员不愿意去做。 异步,则意味着一个任务至少要被拆分为“二段式”的调用方式:一个方法用于发起异步请求,另一个方法用于异步任务完成后的回调。与传统方法调用方式相比,异步调用时的中间数据不能存放在线程栈上,方法之间的也不能简单地通过参数传递的方式来共享数据。此外,传统方法调用中的try…catch…finally,using等关键字都无法跨越方法边界,因此异步编程在处理异常,保护资源等方面也需要花更大的精力才行。如果一不小心,轻则造成资源泄露,重则使整个应用程序崩溃。 因此,无论是微软官方还是社区中都出现了一些简化异步编程方式的组件,例如微软并行与协调运行时和Wintellect's .NET Power Threading Library中的AsyncEnumerator。同时,我基于AsyncEnumerator构建了一个AsyncTaskDispatcher组件,使多个有依赖关系的异步操作之间的协作调用得以大大简化。 以上是引用,自己做了个更简单的demo
引用中提到了在使用AsyncTask时,可以在onPostExecute方法中进行线程完成后的操作。这个方法通常被用来将结果传递回主线程。例如,可以在这个方法中更新UI界面。AsyncTask的使用可以通过创建一个继承于AsyncTask的类来实现,然后在需要的地方调用execute方法来执行任务。引用给出了一个使用AsyncTask的示例,其中定义了一个继承于AsyncTask的InsertAsyncTask类。这个类可以用来在后台线程中执行数据库操作。引用提到了一个使用AsyncTask来加载网络图片的例子,其中使用了LruCache算法进行图片的缓存。综上所述,AsyncTask可以用于数据库操作,通过继承AsyncTask并在doInBackground方法中进行数据库操作,然后在onPostExecute方法中进行结果的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Jetpack学习笔记(一):使用Room和AsyncTask来处理数据库](https://blog.csdn.net/XiaoYunKuaiFei/article/details/105639153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Android Lrucache加载图片(AsyncTask )](https://download.csdn.net/download/u011846345/9184327)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值