`
切切歆语
  • 浏览: 30241 次
  • 性别: 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

    本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间...

    Android用AsyncTask异步加载图片(新)

    本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们了解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`, `Progress`, 和 `Result`。在本例中,`Params`通常是网络...

    AsyncTask异步加载图片

    在`AsyncTaskDemo`这个例子中,我们可以看到如何使用`AsyncTask`来异步加载网络图片: 1. 首先创建一个继承自`AsyncTask`的子类,例如`LoadImageTask`,并指定合适的泛型参数,如`LoadImageTask, Void, Bitmap&gt;`。 ...

    AsyncTask异步下载图片

    下面将详细解释AsyncTask的工作原理和如何使用它来实现异步下载图片。 首先,AsyncTask有三个泛型参数:Params, Progress, Result,分别代表了任务的输入参数类型、进度类型和返回结果类型。在实际应用中,我们通常...

    AsyncTask 异步加载图片

    在这个例子中,我们将探讨如何使用AsyncTask来实现图片的异步加载,并结合进度条展示下载进度。 首先,AsyncTask有三个泛型参数:Params, Progress, Result。Params代表执行任务前可以输入的参数类型,Progress代表...

    AsyncTask异步线程下载图片示例

    在Android开发中,异步处理是一项重要的技术,用于在主线程...然而,在实际开发中,为了更好地处理网络请求和图片加载,往往会选择成熟的第三方库,如Glide、Picasso或Volley,它们提供了更丰富的功能和更好的性能。

    GridView异步加载大量网络图片

    在GridView中,我们可以在onScroll事件中启动AsyncTask,下载和解码图片,然后在onPostExecute中将图片添加到GridView的适配器中。这样,只有当前可见的图片会被加载,从而减少内存消耗。 2. 图片缓存:为了进一步...

    Android用AsyncTask异步加载图片

    总结,`Android用AsyncTask异步加载图片`涉及到的关键技术点包括:`AsyncTask`的生命周期、后台线程执行、UI线程更新、图片的网络加载以及进度条的控制。通过合理运用这些技术,可以提高应用的响应速度,提升用户...

    异步任务AsyncTask

    以下是一个简单的示例,展示如何使用`AsyncTask`下载图片并显示进度: ```java public class DownloadImageTask extends AsyncTask, Integer, Bitmap&gt; { private ProgressBar progressBar; private ImageView ...

    Android最全最简单的异步任务AsyncTask使用解析

    在实际使用中,可以使用AsyncTask来实现各种异步任务,例如网络请求、数据库操作、图片处理等。例如,在一个Activity中,点击按钮时,可以使用AsyncTask来执行耗时的操作,例如下载文件或请求网络数据。 以下是一个...

    AsyncTask异步线程实现加载网络图片

    params)`:这是在后台线程运行的方法,用于执行网络请求和图片的IO操作。在这里,你可以使用HTTP库(如OkHttp或Volley)获取图片的二进制数据,然后将其保存到内存或磁盘。 3. `onProgressUpdate(Progress... ...

    Android Handler AsyncTask 异步加载

    在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...

    Gallery使用AsyncTask异步批量加载图片

    这些库都支持异步加载,并能自动处理内存缓存和磁盘缓存。 3. **onPostExecute方法**: 图片加载完成后,`onPostExecute`方法会在UI线程中执行,将Bitmap对象传给`Gallery`,并更新显示。因为`Gallery`控件需要在...

    Android实现ListView异步加载图片

    要实现异步加载图片,我们需要使用 Thread 或 AsyncTask 来加载图片。这里我们使用 Thread 来加载图片。在 loadDrawable 方法中,我们首先检查图片是否已经加载,如果已经加载,则直接返回缓存的图片,如果没有加载...

    AsyncTask加载网络图片,实现进度条的更新

    在本示例中,我们将深入探讨如何使用`AsyncTask`来加载网络图片并实时更新进度条。 首先,我们需要理解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`、`Progress`和`Result`。`Params`代表异步任务...

    Android AsyncTask异步处理下载网页

    在使用`AsyncTask`处理网页下载时,首先创建一个继承自`AsyncTask`的类,然后重写上述方法。下面是一个基本示例: ```java public class DownloadWebPageTask extends AsyncTask, Void, String&gt; { @Override ...

    Asynctask异步加载的使用

    在Android开发中,异步加载是一项至关重要的技术,它能够帮助开发者解决主线程阻塞问题,提高应用的响应速度和用户体验。"Asynctask异步加载的使用"这一主题涵盖了如何利用Android SDK中的AsyncTask类来实现后台任务...

    AsyncTask下载网络图片 进度条提示

    本篇文章将详细探讨如何使用`AsyncTask`来实现网络图片的下载,并且展示进度条提示。 `AsyncTask`有三个泛型参数,分别是Params、Progress和Result。Params表示后台任务接收的输入参数类型,Progress表示后台任务的...

    ListView异步加载图片

    2. 实现异步加载:使用AsyncTask或其他异步框架(如Handler、Loader)来下载和解码图片。在后台线程中,先检查图片是否已存在于缓存中,如果存在,直接返回;否则,从网络下载图片并解码后存入缓存。 3. 图片加载回...

Global site tag (gtag.js) - Google Analytics