一、简单说明

1, IntentService

IntentService继承自Service,并在其内部创建了工作线程,用来处理耗时操作,其中onHandleIntent方法就是在子线程执行的,我们可以在这里处理耗时操作。

启动时与正常service一样,可以调用startservice来启动IntentService。

注意:(1),在无参构造函数里,必须调用父类一个参数的构造方法; (2),与普通服务不同,IntentService的子线程处理完耗时操作,服务便销毁。

2, HandlerThread

HandlerThread 继承自Thread, 本质上就是一个Thread,内部封装了Looper,不用我们再处理Looper的初始化与消息循环。

我们可以通过获取HandlerThread 内部的looper来构建一个子线程的handler,从而与主线程交互。

常见使用方法:

// 1,创建handlerThread并启动该线程
HandlerThread MyThread = new HandlerThread("MyThread");
MyThread.start();

//2,获取子线程的looper

Looper looper = MyThread.getLooper();

//3,通过子线程的looper创建handler,从而该handler便与子线程绑定
handler = new Handler(looper);
handler#doSomeThing...

3, AsyncQueryHandler

异步查询类,常见使用方法:

//1,继承AsyncQueryHandler并重写onXXXComplete方法,以便增删改查等操作执行完毕后进行下一步操作。

private static class QueryHandler extends AsyncQueryHandler {

public QueryHandler(ContentResolver cr) {
super(cr);
}

@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
super.onQueryComplete(token, cookie, cursor);
System.out.println("查询完毕: " + System.currentTimeMillis());
}

}

//2,调用startXXX方法执行增删改查操作

Uri uri = Sms.CONTENT_URI;
QueryHandler mQueryHandler = new QueryHandler(getContentResolver());
mQueryHandler.startQuery(100, "cookie", uri, null, null, null, Sms.DEFAULT_SORT_ORDER);

4, Loader

主要用来异步加载数据,常见的有AsyncLoader, CursorLoader,详情请参考:Android Loader使用详解

5, AsyncTask

异步任务类,常见,不再赘述

二、代码Demo

//java code

package com.wytiger.goodclass;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.SystemClock;
import android.provider.Telephony.Sms;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

protected static final String TAG = "MainActivity";
private int count = 0;
private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
Button button3 = (Button) findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
// 启动MyIntentService
startService(new Intent(this, MyIntentService.class));
Toast.makeText(this, "点击IntentService", 0).show();
break;
case R.id.button2:
testHandlerThread();
Toast.makeText(this, "点击HandlerThread", 0).show();
break;
case R.id.button3:
startQuery();
Toast.makeText(this, "点击AsyncQueryHandler", 0).show();
break;

default:
break;
}

}

private void testHandlerThread() {
// 创建handlerThread
HandlerThread MyThread = new HandlerThread("MyThread");
MyThread.start();
System.out.println("当前线程:" + Thread.currentThread().getName());
System.out.println("handler线程:" + MyThread.getName());

Looper looper = MyThread.getLooper();
// 子线程的handler
handler = new Handler(looper);
handler.post(mRunnable);
}

/**
* 这在子线程执行
*/
private Runnable mRunnable = new Runnable() {

public void run() {
count++;
// 为了方便 查看,我们用Log打印出来
Log.e(TAG, Thread.currentThread().getName() + ": " + count);
SystemClock.sleep(1000);
// 每2秒执行一次
handler.post(mRunnable);
}

};

@TargetApi(Build.VERSION_CODES.KITKAT)
private void startQuery() {
Uri uri = Sms.CONTENT_URI;
QueryHandler mQueryHandler = new QueryHandler(getContentResolver());
mQueryHandler.startQuery(100, "cookie", uri, null, null, null, Sms.DEFAULT_SORT_ORDER);
System.out.println("开始查询: " + System.currentTimeMillis());
}

/**
* 异步查询类
*
* @author wytiger
* @date 2016-5-26
*/
private static class QueryHandler extends AsyncQueryHandler {

public QueryHandler(ContentResolver cr) {
super(cr);
}

@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
super.onQueryComplete(token, cookie, cursor);
System.out.println("查询完毕: " + System.currentTimeMillis());
}

@Override
protected void onInsertComplete(int token, Object cookie, Uri uri) {
super.onInsertComplete(token, cookie, uri);
}

@Override
protected void onUpdateComplete(int token, Object cookie, int result) {
super.onUpdateComplete(token, cookie, result);
}

@Override
protected void onDeleteComplete(int token, Object cookie, int result) {
super.onDeleteComplete(token, cookie, result);
}

}

@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(mRunnable);
}
}

//xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="IntentService" />

<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="HandlerThread" />

<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AsyncQueryHandler" />

<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Loader" />
<Button
android:id="@+id/button5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AsyncTask" />

</LinearLayout>

//权限声明

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />

为简单而努力:Android封装类详解的更多相关文章

  1. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  2. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  3. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  4. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  5. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  6. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

  7. Android签名详解(debug和release)

    Android签名详解(debug和release)   1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...

  8. Android菜单详解(一)——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  9. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

随机推荐

  1. JMeter学习(十七)JMeter测试Java

    目的:对Java程序进行测试 目录 一.核心步骤 二.实例 三.JMeter Java Sampler介绍 四.自带Java Request Sampler 一.核心步骤 1.创建一个Java工程: ...

  2. GIT安装和使用

    GIT 首先登陆github账号   在本地创建一个文件夹   点击文件夹,右键,选择Git create repository here 操作之后,会生成一个.git文件(这个文件为隐藏文件) 在此 ...

  3. java 28 - 2 设计模式之 模版设计模式

    模版设计模式 模版设计模式概述 模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现 优点 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求 ...

  4. Android两个独立的应用跳转实现方式小结

    在Android应用实现过程中,有时候会遇到应用之间相互跳转的情况,比如跳转至系统设置界面.WiFi设置界面.或者其它的用户实现的应用主界面等等.这里总结了几种常见的打开其它应用activity的方式 ...

  5. Java核心技术点之反射

    1. 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个“反着来”的过程.我们通过new创建一个类的实例时,实际上是由Java虚拟机 ...

  6. css中如何设置字体

    来自百度的回答: 建议使用font-family: "Microsoft YaHei";支持UTF-8和GB2312字符集. 不生效的3种情况:1.当此属性定义的是全局样式时,对于 ...

  7. BZOJ 4034 【HAOI2015】 T2

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...

  8. Android项目,从web上取下汉字,中文部分乱码

    Android项目,从web上取下汉字,中文部分乱码. 常见问题,搜索一下,网上有很多办法解决.如果还没有试过这个办法,可以尝试一下. BufferedReader in = new Buffered ...

  9. STM32 控制红外线收发

    买了一块STM32的板子,这次需要将IR的code移植到STM32上面,因为STM32成本比树莓派低得多,所以 一些简单的外设挂在STM32上就行了. 我买的板子的型号是STM32F103C8T6,价 ...

  10. Infer.net 开源组件: 1, 机器学习入门,要从贝叶斯说起

    我的入门方式,先从应用现象中,总结规律反推本质.一头扎进理论书籍是不对的. 老外的先进,还是体现在传承方面.没办法,我们竞争压力大,有好东西藏着掖着.大家都苦逼 我最开始是从介绍,有了基本概念,见xx ...