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用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
要实现异步加载图片,我们需要使用 Thread 或 AsyncTask 来加载图片。这里我们使用 Thread 来加载图片。在 loadDrawable 方法中,我们首先检查图片是否已经加载,如果已经加载,则直接返回缓存的图片,如果没有加载...
Android 使用AsyncTask 后监听异步加载完毕的动作 AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟 当我们在加载一个列表的...
使用AsyncTask去加载json,并通过json里面的Item的Url去加载ListView条目的图片。涉及知识点如下: 1. ListView显示内容 xml布局+adapter 2. 获取网络数据 URLConnection+I/O 3. 解析Json JsonObject+...
主要讲AsyncTask一些主要方法的使用和有关进度条的一个简单例子,对应我的博客《Android专题之AsyncTask(三)异步方法操作之进度条》,有问题欢迎留言讨论。。。
1、了解异步处理的一般方法 2、掌握如何使用多线程进行异步加载 3、掌握如何使用ASyncTask进行异步加载 4、异步加载的缓存与优化
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是为移动终端打造的真正开放和完整的移动软件。...
以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap> 其中包含三个异步操作类可供测试
1,实现android AsyncTask异步网络下载文件 2,AsyncTask的详细用法,有详细的注解 3,ProgressBar水平滚动条的动态实现方式,与正在下载文件的多少关联滚动条的进度多少。 4,可以中途取消下载文件
Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动...
AsyncTask的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了。场景模拟当我们在加载一个列表的时候,比如GridView,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread、Timer...
Android 网络加载图片优化与内存双缓存磁盘缓存实现 在 Android 应用程序中,加载图片是非常常见的操作...通过使用图片资源优化、异步加载图片和缓存机制,我们可以减少应用程序占用内存的大小,提高应用程序的性能。
加载图片基本操作 一、创建AsyncTask子类 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象。 调用指定大小解析Bitmap方法。 因为是弱引用,所以必须判断引用是否被回收。如果异步任务完成前,...
AsyncTask主要用来更新UI线程,比较耗时的操作可以在...AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask,Inetger,Void>:
Loader是谷歌在Android 3.0引入的异步加载机制,能够对数据异步加载并显示到Activity或Fragment上,使用者不需要对数据的生命周期进行管理,而是交给Loader机制来管理。 使用Loader的优点 假如我们需要从网络上获取...
此示例应用程序使用三种不同的方法将作为字符串加载到 TextView 中: 异步任务:loadDataAsyncTask() RxJava:loadDataRxJava() RxAndroid: loadDataRxAndroid() 只需注释/注释即可尝试它们中的每一个是如何...
丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行...
最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。 demo运行截图: ...
为您提供Swoole异步并行和协程C扩展下载,Swoole是一个为PHP用C和C++编写的基于事件的高性能异步&协程并行网络通信引擎。同时也是PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程...
但是该方法只是用于接收异步线程消息,如果你在该方法中做过多的事情同样会造成UI线程的阻塞。 因此,笔者模仿android的异步访问方式,实现SWT下的Handler机制。通过向handler发送消息,handler接受到消息以后响应...