在 ViewModel 中调用改造 2 是否会导致内存泄漏?



>问题很简单:使用 ViewModel 异步调用改造 2 可能会导致内存泄漏?

如以下示例所示。

显示AsynViewModel.java

public class ShowAsyncViewModel extensions ViewModel {

private static final String TAG = "ShowsAsyncViewModel";
private MutableLiveData<List<Show>> shows;
public LiveData<List<Show>> getShows() {
if (shows == null) {
shows = new MutableLiveData<>();
loadShows();
}
return shows;
}
private void loadShows() {
// Do an asynchronous operation to fetch users.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TvMazeService.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TvMazeService service = retrofit.create(TvMazeService.class);
service.getShows().enqueue(new Callback<List<Show>>() {
@Override
public void onResponse(Call<List<Show>> call, Response<List<Show>> response) {
if (response.isSuccessful()) {
List<Show> showList = response.body();
if (showList != null) {
shows.setValue(showList);
}
} else {
Log.i(TAG, "onResponse: Error code: " + response.code() + " - error message: " + response.message());
}
}
@Override
public void onFailure(Call<List<Show>> call, Throwable t) {
t.printStackTrace();
Log.i(TAG, "onFailure: Failed to connect: " + t.getMessage());
}
});
}
}

改造活动.java

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retrofit);
ShowsAsyncViewModel model = ViewModelProviders.of(this).get(ShowsAsyncViewModel.class);
model.getShows().observe(this, new Observer<List<Show>>() {
@Override
public void onChanged(@Nullable List<Show> shows) {
// Do something with the result
}
});
}

这是我注意到的。

  1. 如果我使用相同的方法调用改造 2,但在 RetrofitActivity 中.java onCreate 方法。我最终遇到了巨大的内存泄漏,因为每次重新创建活动时都会调用改造。
  2. 如果我使用包含上下文的弱引用的私有静态内部类调用 Retrofit 2,则由于弱引用,并且如果用户多次旋转屏幕,则不会多次调用此方法,因此不会获得内存泄漏。
  3. 使用此 ShowAsyncViewModel,我没有出现内存泄漏,可能是因为即使用户多次旋转屏幕,此方法也只调用一次。我想确保这不会导致内存泄漏。

是的,它可能会导致内存泄漏。 想象一下,您从连接到ActivityViewModel进行网络调用的场景。在调用完成之前,不是为了更改配置而销毁活动,而是通过调用finish()来销毁活动。 即使活动和视图模型都被销毁,调用也将继续执行。

为了防止这种情况,您可以按如下方式修改ShowsAsynViewModel.java(kotlin 代码(

// Glogal variable
private lateinit var getShowsNetworkCall: Call<List<Show>>
void loadShows() {
// You can add parameters to the call here
getShowsNetworkCall = service.getShows()
getShowsNetworkCall.enqueue(object: Callback<List<Show>>) {
override fun onResponse(call: Call<List<Trip>>, response: Response<List<Trip>>) {...}
override fun onFailure(call: Call<List<Show>>, t: Throwable) {...}
}
}
override fun onCleared() {
super.onCleared()
getShowsNetworkCall?.cancel()
}

相关内容

  • 没有找到相关文章

最新更新