【发布时间】: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