一 是什么
继承自service 优先级比service高 ,内部封装hander
IntentService最起码有两个好处,一方面不需要自己去new Thread了;另一方面不需要考虑在什么时候关闭该Service了。
二.使用方法
public class MainIntentServiceActivity extends AppCompatActivity implements MyService.UpdateUI {
/**
* 图片地址集合
*/
private String url[] = {
"http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg",
"http://sucai.qqjay.com/qqjayxiaowo/201210/26/1.jpg",
"http://img02.tooopen.com/images/20140504/sy_60294738471.jpg",
"http://img2.imgtn.bdimg.com/it/u=819201812,3553302270&fm=214&gp=0.jpg",
"http://pic55.nipic.com/file/20141208/19462408_171130083000_2.jpg",
"http://img05.tooopen.com/images/20150531/tooopen_sy_127457023651.jpg",
"http://pic.58pic.com/58pic/17/41/38/88658PICNuP_1024.jpg"
};
private static ImageView imageView;
//UI线程的hander
private static final Handler mUIHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
imageView.setImageBitmap((Bitmap) msg.obj);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_intent_service);
imageView = (ImageView) findViewById(R.id.image);
//只会调用 一次service实例 会顺序一个一个执行
Intent intent = new Intent(this, MyService.class);
for (int i = 0; i < 7; i++) {
intent.putExtra(MyService.DOWNLOAD_URL, url[i]);
intent.putExtra(MyService.INDEX_FLAG, i);
startService(intent);
}
MyService.setUpdateUI(this);
}
//接口回调
@Override
public void updateUI(Message message) {
//通知UI线程 加载 图片
mUIHandler.sendMessageDelayed(message, message.what * 1000);
}
}
public class MyService extends IntentService {
public static final String DOWNLOAD_URL = "download_url";
public static final String INDEX_FLAG = "index_flag";
public static UpdateUI updateUI;
//用来接口回调
public static void setUpdateUI(UpdateUI updateUIInterface) {
updateUI = updateUIInterface;
}
public MyService() {
super("MyService");
}
/**
* 实现异步任务的方法
*
* @param intent Activity传递过来的Intent,数据封装在intent中
*/
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//下载图片
Bitmap bitmap = downloadUrlBitmap(intent.getStringExtra(DOWNLOAD_URL));
Message msg1 = new Message();
msg1.what = intent.getIntExtra(INDEX_FLAG, 0);
msg1.obj = bitmap;
if (updateUI != null) {
updateUI.updateUI(msg1);
}
}
/**
* 网络下载 图片
* @param urlString
* @return
*/
private Bitmap downloadUrlBitmap(String urlString) {
HttpURLConnection urlConnection = null;
BufferedInputStream in = null;
Bitmap bitmap = null;
try {
final URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
in = new BufferedInputStream(urlConnection.getInputStream(), 8 * 1024);
bitmap = BitmapFactory.decodeStream(in);
} catch (final IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
try {
if (in != null) {
in.close();
}
} catch (final IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
public interface UpdateUI {
void updateUI(Message message);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return super.onBind(intent);
}
}
三.源码解析
HandlerThread +hander 实现的