AsyncTask的学习

来源:互联网 发布:手机淘宝白夜追凶视频 编辑:程序博客网 时间:2024/06/05 10:53

一周没学习,累觉不爱,周一新刀到手,结果就把手指给切了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) {            }        }    }}

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

原创粉丝点击