Android 异步加载学习

<span style="background-color: rgb(255, 255, 255); font-family: 'Comic Sans MS'; font-size: 18px;"></span><pre code_snippet_id="1625680" snippet_file_name="blog_20160327_1_5498404" name="code" class="java">安卓应用开发应遵循单线程模型(Single Thread Modle)的原则。因为Android的UI操作并不是线程安全的,所以涉及UI的操作必须在UI线程中完成。但是并非所有的操作都能在主线程中进行,可能会导致ANR(Application No Response).所以开发者要遵循两条法则:1.不能阻塞UI线程。2.确保只在UI线程访问UI工具包。于是,就有了开启子线程进行异步处理的技术。


 
<span style="background-color: rgb(255, 255, 255); font-family: 'Comic Sans MS'; font-size: 18px;">一:采用AsyncTask</span>

三个参数:

AsyncTask<Params,Progress,Result>,三个参数由用户自己设定类型,如String,或是自定义的封装类型

*Params  启动任务执行的输入参数,比如http请求的URL

*Progress  后台任务执行的百分比,进度条等

*Result     后台执行任务最终返回的结果

四个主要方法:

*doInBackground(Params...) 子类必须实现的方法。主要负责执行那些耗时的后台处理工作。可以调用PublishProgress方法来更新实时的任务进度。

*onPreExecute()  该方法将在执行实际的后台操作前被UI线程调用。如在界面显示 一个进度条,或者是控件的实例化。

*onPostExecute()  在doInBackground()方法执行完成后被调用,并把结果通过该方法传递给UI线程,并且在界面上显示给用户。

*onProgressUpdate() 在publishprogress方法被调用后,UI线程将调用这个方法在界面上展示任务的进展情况。如通过一个进度条进行展示。

最后,在UI线程中通过execute()方法创建AsyncTask的实例。


实例:图片的异步加载。


 public Bitmap getBitmapFromUrl(String urlString) {
        Bitmap bitmap;
        InputStream is = null;
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            is = new BufferedInputStream(connection.getInputStream());
            bitmap = BitmapFactory.decodeStream(is);
            connection.disconnect();
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
private class newsAsyncTask extends AsyncTask
   
   
    
    {
        ImageView mImageView;
        String mUrl;

        public newsAsyncTask(ImageView image,String url) {
            mImageView=image;
            mUrl=url;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            return getBitmapFromUrl(params[0]);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (mImageView.getTag().equals(mUrl))
            mImageView.setImageBitmap(bitmap);
        }
   
   
 public void showImageByAsyncTask(ImageView imageView,String url){
        new newsAsyncTask(imageView,url).execute(url);

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值