`
切切歆语
  • 浏览: 27504 次
  • 性别: Icon_minigender_1
  • 来自: 泸州市
社区版块
存档分类
最新评论

AsyncTask用法和异步加载图片

阅读更多

 

AsyncTask:是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。

AsyncTask (异步任务),从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。

 

4个步骤:当我们执行一个异步任务的时候,其需要按照下面的4个步骤分别执行

  • onPreExecute(): 这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出要给ProgressDialog

  • doInBackground(Params... params): 在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的最后一个 onPostExecute 方法,在这个方法里,我们可以从网络当中获取数据等一些耗时的操作

  • onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,有时候需要将执行的进度返回给我们的UI界面,例如下载一张网络图片,我们需要时刻显示其下载的进度,就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要在 doInBackground 方法中调用一个 publishProgress(Progress) 的方法来将我们的进度时时刻刻传递给 onProgressUpdate 方法来更新

  • onPostExecute(Result... result): 当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,我们可以将返回的结果显示在UI控件上

一个超简单的理解 AsyncTask 的例子:AsyncTask来从网络上下载一张图片

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/imageViewss"
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:src="@drawable/ic_launcher"
        android:scaleType="fitCenter"/>
 
    <Button
        android:id="@+id/buttonOnClicksAsyncTask"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="200dp"
android:text="从网络上下载一张图片" />
</RelativeLayout>

 Activity代码:

private Button btn;
private ImageViewimageView;
privateProgressDialog progressDialog;
private final String IMGURL= "http://img0.pconline.com.cn/pconline/1206/18/2829090_3867bd63fd673471aa184c02_500.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.asynctask_img);
        btn=(Button)findViewById(R.id.buttonOnClicksAsyncTask);
        imageView =(ImageView)findViewById(R.id.imageViewss);
        progressDialog = newProgressDialog(this);
        progressDialog.setTitle("提示信息");
        progressDialog.setMessage("正在下载中,请稍后......");
        progressDialog.setCancelable(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        btn.setOnClickListener(newView.OnClickListener()
        {
            @Override
            public voidonClick(View v)
            {
            // 在UI Thread当中实例化AsyncTask对象,并调用execute方法
                newMAsyncTask().execute(IMGURL);
            }
        });
    }

 public class MAsyncTask extends AsyncTask<String, Integer, byte[]>
    {
        @Override
        protected voidonPreExecute()
        {
            super.onPreExecute();
            progressDialog.show();
        }
        @Override
        protected byte[]doInBackground(String... params)
        {
            HttpClient httpClient = newDefaultHttpClient();
            HttpGet httpGet = newHttpGet(params[0]);
            byte[] image =new byte[]{};
            try
            {
                HttpResponse httpResponse =httpClient.execute(httpGet);
                HttpEntity httpEntity =httpResponse.getEntity();
                if(httpEntity!= null &&httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
                {
                    image = EntityUtils.toByteArray(httpEntity);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
               httpClient.getConnectionManager().shutdown();
            }
            return image;
        }
        @Override
        protected voidonProgressUpdate(Integer... values)
        {
            super.onProgressUpdate(values);
        }
        @Override
        protected voidonPostExecute(byte[] result)
        {
            super.onPostExecute(result);
            //    将doInBackground方法返回的byte[]解码成要给Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(result,0, result.length);
            //    更新我们的ImageView控件
            imageView.setImageBitmap(bitmap);
            progressDialog.dismiss();
        }
    }
}

 

一个ImageView控件和一个Button控件,当点击Button控件时,弹出一个ProgressDialog,然后开启一个异步任务,从网络中下载一张图片,并更新到我们的ImageView上。这里还要注意一点,如果我们要访问网络,必须还要给其授权才行

AndroidManifest.xml文件:

<uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
         >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 </application>

 

效果图:

 

 

 源码点击下载

 

 

分享到:
评论

相关推荐

    Android AsyncTask用法和异步加载图片.rar

    Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片

    Android AsyncTask 后监听异步加载完毕的动作详解

    Android 使用AsyncTask 后监听异步加载完毕的动作  AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟  当我们在加载一个列表的...

    AsyncTask加载ListView的Item图片完整版

    使用AsyncTask去加载json,并通过json里面的Item的Url去加载ListView条目的图片。涉及知识点如下: 1. ListView显示内容 xml布局+adapter 2. 获取网络数据 URLConnection+I/O 3. 解析Json JsonObject+...

    03_AsyncTask_异步方法操作之进度条

    主要讲AsyncTask一些主要方法的使用和有关进度条的一个简单例子,对应我的博客《Android专题之AsyncTask(三)异步方法操作之进度条》,有问题欢迎留言讨论。。。

    Asynctask异步加载带图的listview,加入lru缓存机制

    1、了解异步处理的一般方法 2、掌握如何使用多线程进行异步加载 3、掌握如何使用ASyncTask进行异步加载 4、异步加载的缓存与优化

    Android 使用AsyncTask 后监听异步加载完毕方法

    Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是为移动终端打造的真正开放和完整的移动软件。...

    Android异步操作实例源码----AsyncTask类

    以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap&gt; 其中包含三个异步操作类可供测试

    AsyncTask 网络下载文件

    1,实现android AsyncTask异步网络下载文件 2,AsyncTask的详细用法,有详细的注解 3,ProgressBar水平滚动条的动态实现方式,与正在下载文件的多少关联滚动条的进度多少。 4,可以中途取消下载文件

    模拟技术中的Android 使用AsyncTask 后监听异步加载完毕方法

    Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动...

    Android 使用AsyncTask 后监听异步加载完毕的动作

    AsyncTask的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了。场景模拟当我们在加载一个列表的时候,比如GridView,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread、Timer...

    Android使用AsyncTask加载图片的操作流程

    加载图片基本操作 一、创建AsyncTask子类 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象。 调用指定大小解析Bitmap方法。 因为是弱引用,所以必须判断引用是否被回收。如果异步任务完成前,...

    异步加载图片

    AsyncTask主要用来更新UI线程,比较耗时的操作可以在...AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask,Inetger,Void&gt;:

    Android 3.0引入的异步加载机制Loader

    Loader是谷歌在Android 3.0引入的异步加载机制,能够对数据异步加载并显示到Activity或Fragment上,使用者不需要对数据的生命周期进行管理,而是交给Loader机制来管理。 使用Loader的优点 假如我们需要从网络上获取...

    RxJava-vs-AsyncTask:使用 AsyncTask、RxJava 和 RxAndroid 加载数据的示例代码

    此示例应用程序使用三种不同的方法将作为字符串加载到 TextView 中: 异步任务:loadDataAsyncTask() RxJava:loadDataRxJava() RxAndroid: loadDataRxAndroid() 只需注释/注释即可尝试它们中的每一个是如何...

    一个异步的Android Http工具,基于OkHttp和Asynctask.zip

    丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行...

    Android带进度条的文件上传示例(使用AsyncTask异步任务)

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。 demo运行截图: ...

    Swoole异步并行和协程C扩展 v4.5.7

    为您提供Swoole异步并行和协程C扩展下载,Swoole是一个为PHP用C和C++编写的基于事件的高性能异步&协程并行网络通信引擎。同时也是PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程...

    swt-async-handler-1.0

    但是该方法只是用于接收异步线程消息,如果你在该方法中做过多的事情同样会造成UI线程的阻塞。 因此,笔者模仿android的异步访问方式,实现SWT下的Handler机制。通过向handler发送消息,handler接受到消息以后响应...

    android 异步刷新demo

    这个demo集中使用AsyncTask和hander两种方式从网络中下载东西,理解其使用方法,以及之间的区别。

    Swoole异步并行和协程C扩展 v4.5.9

    为您提供Swoole异步并行和协程C扩展下载,Swoole是一个为PHP用C和C++编写的基于事件的高性能异步&协程并行网络通信引擎。同时也是PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程...

Global site tag (gtag.js) - Google Analytics