相关疑难解决方法(0)

为什么不保证调用onDestroy()?

根据android Activity Lifecycle,唯一保证被调用的回调(如果一个活动离开Running状态,这通常是预期的)onPause().

因此,我必须假设有些情况下实施它们是有意义的onStop(),onDestroy()尽管它们并没有真正保证被调用.

我理解,onStop()当一个活动可能通过Stopped状态返回Running状态时应该实现(为什么它会这样做而不是直接返回是一个不同的问题).

但是onDestroy(),当我可以将所有清理/状态保存放入时onPause(),需要我不清楚.

你能描述一下实际的应用情况(即不能驾驶汽车等),实施它是否合理onDestroy()

android activity-lifecycle android-activity

45
推荐指数
1
解决办法
2万
查看次数

Activity的onDestroy/Fragment的onDestroyView设置了Null实践

我正在阅读ListFragment源代码,我看到了这个实现:

ListAdapter mAdapter;
ListView mList;
View mEmptyView;
TextView mStandardEmptyView;
View mProgressContainer;
View mListContainer;
CharSequence mEmptyText;
boolean mListShown;

/**
 * Detach from list view.
 */
@Override
public void onDestroyView() {
    mHandler.removeCallbacks(mRequestFocus);
    mList = null;
    mListShown = false;
    mEmptyView = mProgressContainer = mListContainer = null;
    mStandardEmptyView = null;
    super.onDestroyView();
}
Run Code Online (Sandbox Code Playgroud)

在此函数中,Google开发人员将Null设置为在ListFragment中声明的所有视图字段,并删除回调"mRequestFocus".

ListActivity源代码中.Google开发人员实施如下:

protected ListAdapter mAdapter;
protected ListView mList;

private Handler mHandler = new Handler();


@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRequestFocus);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

我没有看到Google开发人员在ListActivity的onDestroy上将Null设置为mList,就像他们为ListFragment类所做的那样.

我的问题是

  1. 为什么谷歌开发者没有在ListActivity的onDestroy中将Null设置为mList?有什么原因?

  2. 我们是否需要将Null设置为Activity的onDestroy和Fragment的onDestroyView中的所有View字段?

3.在这两个函数中设置Null的任何做法:Activity的onDestroy和Fragment的onDestroyView?

谢谢你的想法!

android ondestroy android-fragments android-activity

34
推荐指数
1
解决办法
2万
查看次数

何时会调用Fragment的onDestroyView,但它不会被销毁?

看一下Fragment的生命周期,我不确定这里可能发生的情况.当Fragment停止活动时,有两种可能的方法.

  1. 调用适当的回调,销毁视图然后销毁片段
  2. 调用回调,销毁视图,但保持片段本身存活

在哪种情况下完成了两种替代方案中的哪一种?是什么决定了他们中的哪一个?如果将一个片段添加到后台堆栈中,然后删除/替换,为什么不将它丢弃?为什么要保留它?

编辑:它突然出现在我身上,是否取决于片段是否被保留?

在此输入图像描述

android android-fragments

18
推荐指数
2
解决办法
2万
查看次数

EventBus:当应用在后台时,活动不会收到活动

我使用EventBus之间的沟通ActivityService.今天我遇到了问题,不知道为什么.

  1. 我有Activity,FragmentService.所有这些都很好.

  2. ActivityFragment我们registered他们Receive events交付Service

  3. ActivityFragmentun-register他们的时候onDestroy()被调用.

  4. 在正常情况下,当Services提供events,FragmentActivity可以接收这些events,做工精良.

  5. 但是,当App上推background(通过按下Home或电源按钮),只Fragment接收从交付的事件Service,以及Activity不接收他们.

  6. 我没有做任何事情onPause()都的ActivityFragment.

题:

那有什么解释吗?如何在应用程序被推送到后台时才能完成Activity接收事件Fragment

service android background-process event-bus android-fragments

16
推荐指数
3
解决办法
6268
查看次数

是否保证为片段调用onDestroy()?

我知道onDestroy(...)不能保证调用Activity .根据文件,

在某些情况下,系统会简单地杀死活动的托管进程,而不会在其中调用此方法(或任何其他方法),因此不应该使用它来做那些意图在进程消失后留下来的东西.

这也适用于碎片吗?文档中没有任何内容,只是想确定.

android android-fragments

10
推荐指数
1
解决办法
8091
查看次数

Android 片段生命周期 onStop、onDestroyView、onDestroy 和 onDetach

Android 文档谈到 onStop 和 onDestroy 在某些情况下无法调用,但我没有发现任何与片段相同的内容。是否始终调用 onPause、onStop、onDestroyView、on Destroy 和 onDetach?仅在暂停时?

lifecycle android fragment

5
推荐指数
1
解决办法
1万
查看次数

谷歌地图 MapsView 泄漏

我已将 Google Maps MapView 添加到 Android 中的 Fragment。到目前为止,它是一张没有任何标记、选项或其他任何东西的清晰地图。尽管如此,每当我离开 Fragment 时,应用程序都会出现内存泄漏。

我已经尝试了我发现的所有建议的解决方案,例如将 MapView 附加到 Fragment Lifecycle,将其设置为不为 nullonDestroyView()等等,但内存泄漏仍然存在。

当前代码如下所示:

fragment_map.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

MapViewFragment.java

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_map, container, false);

        mMapView = view.findViewById(R.id.mapView);
        mMapView.onCreate(savedInstanceState);
        mMapView.onResume();

        MapsInitializer.initialize(Objects.requireNonNull(getActivity()).getApplicationContext());

        mMapView.getMapAsync(googleMap -> {
            mGoogleMap = googleMap;
        });

        return view;
    }

@Override
public void onResume() {
        super.onResume();
        mMapView.onResume();
    }

@Override
public …
Run Code Online (Sandbox Code Playgroud)

java android google-maps memory-leaks leakcanary

5
推荐指数
1
解决办法
791
查看次数