一般情况下在android中使用多线程的时候,我们都是在线程运行的时候使用Handler来给主线程传递消息,这样用起来虽然没什么不好,但是总感觉有点乱。其实Android已经提供了一个标准的实现多线程的模型,那就是AsyncTask类。
这个类用起来很简单,继承他之后,override几个方法,然后就可以在线程执行过程中,不断的将结果通知给ui线程。
下面简单讲一下用法,看代码:
package cn.infogiga.starter;
import android.os.AsyncTask;
import android.util.Log;
/**
* @author chroya
*
*/
public class MyThreads extends AsyncTask<Integer, Integer, Integer>{
@Override
protected Integer doInBackground(Integer... params) {
int p = 0; //计数
for(int index=0; index<params.length; index++) {
int num = params[index];
for(int j=0; j<num; j++) {
if(num-j<=0) {
break;
}
p++;
//通知每一次的数目变化
publishProgress(p);
}
}
//返回总数
return p;
}
@Override
protected void onProgressUpdate(Integer... progress) {
Log.d("onProgressUpdate", "progress:"+ progress[0]);
}
@Override
protected void onPostExecute(Integer result) {
Log.d("onPostExecute", "result:"+ result);
}
}
MyThreads继承了AsyncTask,他有三个泛型参数,第一个是任务执行所需要的参数类型,第二个是任务的进度表示类型,第三个是进度计算的结果类型。
我override了三个方法:
doInBackground:就是任务执行的主方法,它会被作为一个线程运行。
onProgressUpdate:进度更新的时候调用,进度什么时候更新呢?就是调用了publishProgress方法之后就更新。
onPostExecute:在doInBackground执行并返回之后调用,因为他需要doInBackground的返回值做参数。
怎么使用它呢?
new MyThreads().execute(10, 20, 30);
没错,就这一句。
这一句传递了三个参数进去,传递给了
doInBackground,然后线程开始运行,将三个数开始逐一计数,虽然计数不用这么麻烦,但是为了弄明白AsyncTask的运行机制,复杂点反而好。
结果打印出
onProgressUpdate的
1到60,最后打印出了
onPostExecute的result:60.
分享到:
相关推荐
在这个项目中,可能使用了AsyncTask或者自定义的线程池来实现多线程下载。 其次,断点续传是下载过程中的一种优化策略。当文件下载中断,例如由于网络问题或用户手动暂停,系统会记住当前已下载的文件位置,下次...
AsyncTask的介绍及基本使用方法关于AsyncTask的介绍和基本使用方法可以参考官方文档和《Android开发笔记之:深入理解多线程AsyncTask》这里就不重复。AsyncTask引发的一个问题上周遇到了一个极其诡异的问题,一个小...
由于Oracle通常需要更多的系统资源,所以同样建议在后台线程中处理数据库操作。 4. **连接SQL Server** 对于SQL Server,可以使用`jtds.jar`这样的开源JDBC驱动。配置过程涉及设置URL、用户名、密码等信息,然后...
总之,“Android-猎豹'快切App'中用到的Android开发技巧”涵盖了滑动交互、性能优化、多线程处理、UI设计和第三方库的使用等多个方面,通过分析`WellSwipe-master`源码,我们可以更深入地学习这些实用技巧,并将其...
此外,还可能涉及异步处理,如AsyncTask和Handler,以实现后台任务与UI线程的分离。 数据库管理方面,讲义会涉及到SQLite的使用,包括创建数据库、表,以及查询、插入、更新和删除数据的方法。 权限管理也是...
7. **ContentProvider**:ContentProvider是Android中用于数据共享的机制,使得不同应用之间可以安全地访问和操作数据,尤其适用于跨应用的数据交换。 8. **Android权限管理**:Android系统通过权限模型来保护用户...
2. **Canvas与Paint**: `Canvas`是Android中用于图形绘制的基础对象,而`Paint`则用于设置绘制颜色、线条样式等属性。在水波效果中,开发者会用到`Canvas`的`drawCircle()`、`drawPath()`等方法来描绘雨滴和涟漪,...
2. **RecyclerView**:RecyclerView是Android中用来展示大量数据的高效组件,替代了旧版的ListView。你需要设置LayoutManager(如LinearLayoutManager或GridLayoutManager)来决定数据如何布局,同时需要创建一个...
1. **Bitmaps**: Bitmap是Android中用于存储像素数据的基本类。处理Bitmap时,需要注意内存占用,过大可能导致内存溢出。可以使用`BitmapFactory`来解码图片,并通过设置解码选项(如`inSampleSize`)来调整图片大小...
6. **多线程与异步处理**: - 网络请求通常在后台线程进行,避免阻塞主线程,提高应用响应速度。可以使用`AsyncTask`或`Handler`来实现。 - 使用`WebView`的`setWebChromeClient()`和`setWebViewClient()`方法注册...
2. **布局设计**:XML是Android中用来定义用户界面的主要语言。开发者可以通过XML文件创建和组织视图组件,如按钮、文本框等,并通过布局管理器(如线性布局、相对布局、网格布局等)控制组件的排列方式。 3. **...
ListView是Android中用来展示大量数据的视图组件,配合自定义Adapter可以加载动态数据,实现滑动刷新和无限滚动等功能。 5. **网络请求与数据解析**:微博客户端需要从服务器获取数据,这就涉及到HTTP请求和JSON...
最后,第12章可能涵盖Android的高级话题,如多线程与并发、JNI(Java Native Interface)与NDK(Java Native Development Kit)开发,或者是Android组件间的交互,如Intent和Fragment的使用。也可能包含关于性能优化的...
10. **多线程与异步处理**:Android应用的UI线程不应阻塞,因此需要理解AsyncTask、Handler、Thread和IntentService等多线程技术。源代码会展示如何在后台执行耗时任务,以保持应用的响应性。 通过学习和分析这些源...
- **Bitmap**: Bitmap是Android中用于存储像素数据的基本类,它代表了图片的像素数组。开发者可以通过` BitmapFactory `类来加载、解码图片资源,例如从文件、内存或网络中获取Bitmap对象。 - **ImageView**: 这...
Intent是Android中用来在组件间传递消息的机制,常用于启动Activity或Service,实现应用间的交互。 五、服务(Service) Service是后台运行的组件,不与用户界面直接交互,常用于执行长时间任务,如音乐播放、网络...
5. **RecyclerView**:RecyclerView是Android中用来展示列表数据的重要组件,它可以高效地管理大量视图复用,降低内存消耗。项目中很可能用到它来展示新闻列表。 6. **Adapter**:适配器是连接数据源和RecyclerView...
- BroadcastReceiver是Android中用来接收系统或自定义广播事件的组件。 - 在Service中发送广播,UI界面注册对应的Receiver,接收到广播后更新UI,如显示下载进度或提示下载完成。 - 需要注意,BroadcastReceiver...
为了提高应用的响应速度,开发者会使用多线程技术,如`IntentService`、`HandlerThread`或`JobScheduler`,来处理耗时任务,同时保持用户界面的交互性。 10. **推送通知(Push Notifications)**: 为了保持用户...
其次,`ListView`是Android中用来展示可滚动列表的视图组件,非常适合用来显示歌曲列表。你可以创建一个自定义的`ListView`适配器,将歌曲信息(如歌曲名、艺术家、时长等)绑定到列表项上。`Adapter`类需要继承自`...