【问题标题】:How can I ensure my background thread is tied to my ViewModel and not a Zombie Activity? (Android/Java/MVVM)如何确保我的后台线程绑定到我的 ViewModel 而不是 Zombie Activity? (安卓/Java/MVVM)
【发布时间】:2020-07-19 22:24:14
【问题描述】:

我最近用 Java 实现了一个 ViewModel 和一些 LiveData 组件来保存从我的 Android 应用上的网页获取的结果列表。

我的目标是确保在配置更改(例如从纵向更改为横向)时,任何获取数据的后台线程都不会与死/僵尸活动相关联,并且不会与 ViewModel 本身相关联,这样就不会导致重复的线程内存泄漏。

我的问题是:从 ViewModel 中启动线程是否足以确保线程绑定到 ViewModel 而不是僵尸 Activity?我了解 ViewModel 具有生命周期意识,因此它不会“死亡”或在配置更改时被破坏。

我的 Application 类拥有一个全局 ExecutorService 和 Handler:

public class MyApplication extends Application {

    private ExecutorService executorService = Executors.newSingleThreadExecutor();
    private Handler mainThreadHandler = Handler.createAsync(Looper.getMainLooper());

    public Handler getMainThreadHandler() {
        return mainThreadHandler;
    }

    public ExecutorService getExecutorService() {
        return executorService;
    }

当用户点击按钮开始在Activity的View上获取数据时,Activity调用ViewModel的search函数,传入handler和executor服务:

public class MyViewModel extends ViewModel {

    ...

    public void SearchForResults(final String state, final String name, final ExecutorService  executorService, final Handler handler)
    {

        executorService.submit(new Runnable() {
            @Override
            public void run() {
                /*NETWORK LOGIC - FILTERING,ETC*/

                ...

                /* to update LiveData class variables of ViewModel */
                handler.post(new Runnable() {  
                    @Override
                    public void run() {
                        liveData1.setValue(true);
                        liveData2.setValue(false);
                    }
                });

            }
        });
    }

如果 Activity 在后台运行时被销毁,这些线程是否会保留在 ViewModel 中?我们如何确定线程的“所有者”是什么?

使用 UI 线程处理程序从后台线程更新 ViewModel 的类变量是否合适?

感谢您的帮助。

【问题讨论】:

  • 你的理解是正确的,要么写在应用类中,要么写在视图模型里面。
  • @notTdar “写入应用程序类或内部视图模型”是什么意思?

标签: java android multithreading mvvm


【解决方案1】:

我的问题是:从 ViewModel 中启动线程是否足以确保线程绑定到 ViewModel 而不是僵尸 Activity?

是的,尽管您仍然必须小心您的线程所持有的任何引用。如果它持有一个 Activity 或 View 或其他本身持有您可能已传递给 ViewModel 的 Activity 的东西,那么您就有问题了。

如果 Activity 在后台运行时被销毁,这些线程是否会保留在 ViewModel 中?

是的。

我们如何确定线程的“所有者”是什么?

嗯,“所有者”是启动线程的对象,因此您应该知道所有者是谁。您不必从线程本身中看到这一点。

使用 UI 线程处理程序从后台线程更新 ViewModel 的类变量是否合适?

我不知道“正确”——Kotlin 和协程现在很流行——但既然你使用的是 Java,它可能没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2011-06-10
    • 2011-07-19
    • 2020-03-06
    相关资源
    最近更新 更多