android后台任务(一):Handler
来源:互联网 发布:匿了网络用语 编辑:程序博客网 时间:2024/06/16 20:15
一般网络请求,I/O操作这样费时的网络请求需要在工作线程进行而不是在UI主线程,不然会造成UI的卡顿。但是android不能在非UI线程更新UI,所以我们一般使用Looper+Handler+Thread来处理。
先看看一般的简洁使用。
package com.example.asus.practise;public class MainActivity extends AppCompatActivity{ private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView); Handler mHandler = new Handler(); //延迟五秒处理这个处理这个消息,而不是让线程暂停5秒 mHandler.postDelayed(new Runnable() { @Override public void run() { mTextView.setText("11111"); } },5000); }}
但是上面这样容易造成内存泄漏,看下面的复杂实现:
package com.example.asus.practise;public class MainActivity extends AppCompatActivity{ /** * 这里使用静态内部类继承Handler * 如果使用普通或者匿名内部类,Handler实例会持有父类MainActivity的引用 * 而如果MainActivity被关闭之后Handler还没有被销毁 * MainActivity就会因为被Handler持有引用而不会被回收,造成内存泄漏 */ private static class MyHandler extends Handler { //既然Handler不能持有MainActivity引用,但是又需要MainActivity对象,就需要一个弱引用 private WeakReference<MainActivity> activityWeakReference; private TextView tv; public MyHandler(MainActivity activity) { activityWeakReference = new WeakReference<MainActivity>(activity); } @Override public void handleMessage(Message msg) { MainActivity mainActivity = activityWeakReference.get(); if (mainActivity == null)return; TextView tv = mainActivity.getmTextView(); if (tv == null)return; switch (msg.what) { case 1: tv.setText("1"); break; case 2: tv.setText("2"); break; } } } private TextView mTextView; public TextView getmTextView() { return mTextView; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView); Handler mHandler = new MyHandler(this); Message msg = mHandler.obtainMessage(1);//最好不要自己新建Message mHandler.sendMessage(msg); }}
这个看起来好像有点麻烦,主要是为了防止内存泄漏。
每次需要执行异步任务的时候,如果我们都需要写这么一套代码,显得很麻烦,于是就有了AsyncTask,它将这整个过程封装了,只留下几个方法让用户实现,用起来很方便,但是也容易造成内存泄漏,所以应该用更安全,更简单的方式来完成异步任务,Handler和AsyncTask都是不推荐的。
0 0
- android后台任务(一):Handler
- Android 后台任务(二)Thread And Handler
- Android 后台任务(一)概述
- Android Handler 定时任务
- android Handler 介绍(一)
- Android - Handler 、AsyncTask(一)
- Android-Handler复习(一)
- Android使用Handler与timer及TimerTask结合的方法来实现后台运行定时任务
- Android 后台任务(三)AsyncTask
- Android 后台任务(四)Loader
- Android 后台任务(五)Service
- Android 后台任务(六)IntentService
- Android 后台任务(八)内存泄露
- Android 后台任务(七)内存泄露
- android后台任务(二):IntentService
- android后台任务(三):Loader
- android后台任务处理
- android 计划任务(Alarm,Timer,Thread,handler实现比较)
- cocos2dx ui::Button 的addClickListener问题
- 最全的Android源码目录结构详解
- hdoj4987Little Pony and Dice【概率dp】
- 排查Java线上服务故障的方法和实例分析
- cocos2d-x学习笔记--创建对象、构造函数及初始化
- android后台任务(一):Handler
- Java 将图片导入到 Taobao TFS 的实现
- 从unique_ptr赋值到shared_ptr引起的指针悬空bug
- 【读书笔记】Android源码设计模式解析与实践(一)
- IOS-第七天笔记
- Android Binder机制
- 大型网站架构系列:20本技术书籍推荐
- hdu1176 免费馅饼(简单DP)
- 毕业设计第二天