Android 处理程序更改 WeakReference

2023-11-21

我的静态处理程序有一个WeakReference to my Activity(这是为了防止有据可查的内存泄漏问题)。

我发布了一条长时间延迟的消息,我希望将此消息传递到我的活动(应该位于前台)。

我担心的是,在方向改变时,我的活动被销毁,并且处理程序引用了应该被销毁的旧活动。

为了解决这个问题onCreate对于我这样做的活动。

    if(mHandler == null)
        mHandler = new LoginHandler(this);
    else {
        mHandler.setTarget(this);
    }

我的处理程序被声明为静态全局变量:

private static LoginHandler     mHandler            = null;

并且实现类也是静态的,如下所示:

private static class LoginHandler extends Handler {

    private WeakReference<LoginActivity>    mTarget;

    LoginHandler(LoginActivity target) {
        mTarget = new WeakReference<LoginActivity>(target);
    }

    public void setTarget(LoginActivity target) {
        mTarget = new WeakReference<LoginActivity>(target);
    }

    @Override
    public void handleMessage(Message msg) {
        // process incoming messages here
        LoginActivity activity = mTarget.get();
        switch (msg.what) {
            case Constants.SUCCESS:
                activity.doSomething();
                break;

            default:
                activity.setStatusMessage("failed " + msg.obj, STATUS_TYPE_DONE);
        }
    }
}

我想知道的是更改 WeakReference 是否有问题onCreate或者这种方法还有什么问题吗?

Thanks,


所以我写了下面的测试来弄清楚我的想法是否正确,看来我的方法是正确的。在onCreate我们改变WeakReference并且发布的消息将始终传递到前台的活动。如果您更改此代码以始终在中创建新的处理程序onCreate您会注意到更新消息未发送。

public class MainActivity extends Activity {

    private static int COUNT = 0;

    static LoginHandler mHandler;

    private static class LoginHandler extends Handler {

        private WeakReference<MainActivity> mTarget;

        LoginHandler(MainActivity target) {
            mTarget = new WeakReference<MainActivity>(target);
        }

        public void setTarget(MainActivity target) {
            mTarget.clear();
            mTarget = new WeakReference<MainActivity>(target);
        }

        @Override
        public void handleMessage(Message msg) {
            // int duration = Toast.LENGTH_LONG;
            // process incoming messages here
            MainActivity activity = mTarget.get();
            activity.update(msg.arg1);
        }
    }

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

        if(mHandler == null)
            mHandler = new LoginHandler(this);
        else
            mHandler.setTarget(this);

        ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Message msg = new Message();
                msg.arg1 = COUNT++;
                mHandler.sendMessageDelayed(msg, 3000);

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void update(int count) {
        ((TextView) findViewById(R.id.hello_world)).setText("Hello World @ "+ count);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 处理程序更改 WeakReference 的相关文章

  • RecyclerView每隔几个项目都是相同的 - 可扩展项目

    我的 recyclerView 有问题 我正在使用此布局来扩展 recyclerView 中的 cardView https github com AAkira ExpandableLayout https github com AAkir
  • 检测正在插入的设备

    我希望能够检测设备是否已插入 我希望能够像查询连接状态一样进行查询 这可能吗 或者我是否需要创建一个监听电池事件的广播接收器 显然是ACTION BATTERY CHANGED http developer android com refe
  • Android-ListView-performItemClick

    当我尝试使用时遇到一些困难执行项目单击ListView 的功能 我想要做的就是以编程方式在列表的第一项中执行单击 我怎样才能做到这一点 我在文档中查找了该函数 但我并不真正理解它的参数 我尝试过类似的事情 myListView perfor
  • Android - 手机锁定时执行操作

    我想知道如何在手机锁定时执行某些操作 或继续侦听传感器或电池更换事件 当手机锁定时 它会停止监听传感器的变化 我尝试过使用唤醒锁 但它不起作用 也许我使用错误 任何帮助 将不胜感激 我建议为此使用服务 即使手机被锁定 它们也会在后台运行 这
  • 如何增加 Gradle 守护进程的最大堆大小?

    签署 apk 时 我收到以下消息 To run dex in process the Gradle daemon needs a larger heap It currently has 1024 MB For faster builds
  • 强制关闭导致HTTP实体可能不为空

    这里是发送数据 Http 的完整代码 asynctask private class MyAsyncTaskPupuk extends AsyncTask
  • Android/java:从 ProGuard 过渡/迁移到 R8?

    我想知道如何从ProGuard to R8 我是否应该从 Gradle 文件中删除与 Proguard 相关的行并添加android enableR8 true线代替 Thanks Proguard 由 GuardSquare 开发和维护
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 在一个react-native项目中使用谷歌地图和FCM

    I want to use google map and FCM in one react native project first I added FCM in project everything was okay but when I
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • 无法在 Android Studio 中运行项目

    当我尝试在 Android Studio 中运行我的项目时 我收到以下错误消息 Execution failed for task CricHQ dexDebug gt com android ide common internal Log
  • 可下载字体例外

    我决定使用可下载字体 https developer android com guide topics ui look and feel downloadable fonts html在我的项目中 IS 按照指南中的建议实施了所有内容 当我
  • 特定铃声 firebase 通知 xamarin.android

    How i can force the push notification to run ringtone instead of default notification sound is there any way to ovveride
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • Android 报告“Error=Unable to find Instrumentation info for: ComponentInfo {}”

    stackoverflow 上有很多关于这个问题的主题 问题 例如错误 无法找到以下仪器信息 ComponentInfo https stackoverflow com q 21294945 513413 和其他网站 但使我的问题与其他网站
  • 尝试重新打开已关闭的对象:sqlitequery

    所以本质上我查询数据库两次 我不明白这个错误真正来自哪里 因为我没有在任何地方关闭数据库 返回错误的代码是这样运行的 我查了一下 刚刚看到一个像我这样的案例 BeaconHandler pullAllDB new BeaconHandler
  • Android:在surfaceview上实现admob

    我有一个使用 SurfaceView 的小游戏形式的活动 下面是代码片段 我很困惑如何在 SurfaceView 上实现 admob 请建议 public class DroidzActivity extends Activity priv
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • 如何让脚本在不破坏 CSP 的情况下使用 setAttribute 'style'

    我正在努力使我的 CSP 政策尽可能严格 我需要在我的捆绑包中包含 3d 派对组件 但它使用element setAttribute style 破坏CSP的方法 有没有办法允许这个特定的脚本以这种方式内联样式 是的 有办法 这里有很多关于
  • 如何将外部项目中的控制器和视图包含到 MVC6 中?

    我有一些带有控制器和视图的模块 它基本上是我的网络应用程序的扩展 每个模块都在一个类库中 我想从我的 Web 应用程序加载这些程序集 但我在这里运气不好 我的解决方案文件结构如下 src Web Common Class Library P
  • NSFetchedResultsController 返回重复项(相同的 objectID 和引用)

    我在 NSFetchedResultsController 中遇到了奇怪的行为 这是 iOS 10 中的新功能 开门见山 fetchedObjects包含重复的对象 按照我自己的标准 这绝不是 重复 它们实际上具有相同的 objectID
  • Dagger 在模块上找不到可注入成员

    我在用着Dagger用于 Android 项目中的依赖注入 并且可以很好地编译和构建应用程序 对象图似乎是正确且有效的 但是当我添加 dagger compiler 作为依赖项以在编译时获取错误时 它会报告一些奇怪的错误 ERROR err
  • Dot 不支持新安装的 Graphviz 中的任何格式

    我已经使用推荐的过程在 Fedora 上安装了 Graphviz描述在 GraphViz 官方网站 但是 我无法转换基本的hello dot文件使用dot命令 我的 hello dot 文件是 graph hello Node1 label
  • 在 playframework 中自定义文件更改时重新加载应用程序

    在play框架中有自动重新加载功能 这意味着在开发模式下 每个请求都会检查文件的更改 并在必要时重新编译和重新加载项目 所以 举例来说 如果我 touch conf routes 项目将在下次请求时重新加载 我想添加一些自定义文件来监视 我
  • 币安 API Hmac 签名

    请帮助我不知道我的代码有什么问题 不需要签名的端点工作正常 所以我想我如何获取签名有问题 我收到此错误 data code 2014 msg API key format invalid API文档 https github com bin
  • 将文件从 Google Cloud Container Builder 传递到 Docker 构建任务

    Context 使用 Container Builder 构建的用于 App Engine 的 Ruby on Rails 应用程序 我们要求捆绑器能够使用 SSH 密钥从私有 git 存储库安装依赖项 SSH 密钥来自安全存储桶 并通过
  • 为什么我们总是在 Android/Java 中输入强制类型转换?

    我正在编写一个 Android 应用程序 只是很好奇为什么我们必须始终在 Android 中进行类型转换 我知道我们需要确定类型 以便我们的代码正常运行 但是也许还有其他原因吗 Example public class Navigation
  • Scala 方式处理 for 理解中的条件?

    我正在尝试创建一个简洁的结构 以理解基于 future 的业务逻辑 这是一个示例 其中包含基于异常处理的工作示例 for find the user by id findUser id returns Future Option User
  • 如何在节点集上使用“翻译”Xpath 函数

    我有一个 XML 文档 其中包含我想要删除的带破折号的项目 e g
  • 单例和多线程

    我有以下课程 class Singleton private static Singleton p inst Singleton public static Singleton instance if p inst p inst new S
  • Python 中哪些函数可重入用于信号库处理

    讨论中Python 中的信号处理程序和日志记录我想到了Python中哪些函数是可重入的问题 The 信号库提到 虽然 Python 信号处理程序是 异步调用最多 对于Python用户来说 他们可以 只发生在原子之间 Python 的指令 口
  • 如何在django中将文件流式传输到客户端

    我想知道如何使用 django 将数据流式传输到客户端 The Goal 用户提交表单 表单数据被传递到返回字符串的 Web 服务 该字符串已压缩 tar gz 并将 tarball 发送回用户 我不知道有什么办法 我搜索了一下 发现了th
  • 代码高尔夫:将多个排序列表合并为一个排序列表

    实现一种算法 将任意数量的排序列表合并为一个排序列表 目的是用您喜欢的任何语言创建最小的工作程序 例如 input 1 4 7 2 5 8 3 6 9 output 1 2 3 4 5 6 7 8 9 input 1 10 2 5 6 7
  • 谷歌帐户注销并重定向

    我正在使用 openid 来登录用户 仅限谷歌帐户 现在我的页面中有一个注销链接 单击该链接后 我希望用户退出谷歌帐户并将页面重定向到我的主页 这可以做到吗 Edit 更改接受的答案 因为现在 Google 允许重定向 继续 到您想要的任何
  • C# / .Net 中“新”属性的优缺点?

    考虑以下示例代码 delivery strategies public abstract class DeliveryStrategy public class ParcelDelivery DeliveryStrategy public
  • 对具有 NaN 的列进行缩尾处理不会更改最大值

    请注意 不久前有人提出了类似的问题 但从未得到答复 请参阅缩尾处理不会改变最大值 我在尝试着winsorize数据框中的列使用winsorize from scipy stats mstats 如果列中没有 NaN 值 则该过程正常运行 然
  • Java流/收集:将具有多个字段的一项映射到多个键

    我想尝试使用 java 收集器编写以下代码 给定一个人的 2 个属性 名字和姓氏 我想获取一个包含唯一的名字或姓氏作为键的映射 以及相应人员的列表 这是一组数据 Person person1 new Person person1 setFi
  • Android 处理程序更改 WeakReference

    我的静态处理程序有一个WeakReference to my Activity 这是为了防止有据可查的内存泄漏问题 我发布了一条长时间延迟的消息 我希望将此消息传递到我的活动 应该位于前台 我担心的是 在方向改变时 我的活动被销毁 并且处理