我花了整整4天时间尽我所能来弄清楚我正在开发的应用程序中的内存泄漏,但事情很久以前就停止了.
我正在开发的应用程序具有社交性,因此请考虑配置文件活动(P)并列出包含数据的活动 - 例如徽章(B).您可以从配置文件跳转到徽章列表,转到其他配置文件,其他列表等.
所以想象一下这样的流程P1 - > B1 - > P2 - > B2 - > P3 - > B3等.为了保持一致性,我正在加载同一个用户的配置文件和徽章,所以每个P页面是相同的,所以是每个B页面.
这个问题的一般要点是:在导航了一下之后,根据每个页面的大小,我在随机位置得到了一个内存不足的例外 - 位图,字符串等 - 它似乎并不一致.
在做了一切可以想象的事情来弄清楚为什么我的内存不足之后,我什么也没想出来.我不明白的是,如果Android在加载时耗尽内存而不是崩溃,那么为什么Android不会杀死P1,B1等.如果我通过onCreate()和onRestoreInstanceState()返回它们,我会期望这些早期活动会死亡并复活.
更别说这个 - 即使我做P1 - > B1 - >返回 - > B1 - >返回 - > B1,我仍然会崩溃.这表明某种内存泄漏,即使在转储hprof并使用MAT和JProfiler后,我也无法查明它.
我已禁用从Web加载图像(并增加了加载的测试数据以弥补它并使测试公平)并确保图像缓存使用SoftReferences.Android实际上试图释放它所拥有的一些SoftReferences,但就在它崩溃内存之前.
徽章页面从Web获取数据,从BaseAdapter将其加载到EntityData数组中并将其提供给ListView(我实际上使用的是CommonsWare的优秀MergeAdapter,但在此Badge活动中,实际上只有1个适配器,但我无论哪种方式都想提到这个事实).
我已经完成了代码并且无法找到任何可能泄漏的内容.我清除并取消了我能找到的所有内容,甚至是System.gc()左右,但应用程序崩溃了.
我仍然不明白为什么堆栈上的非活动活动不会被收获,我真的很想知道这一点.
在这一点上,我正在寻找任何提示,建议,解决方案......任何有用的东西.
谢谢.
Android医生说:
"当系统而不是用户关闭活动以节省内存时......"
但是如何模拟这种情况?我想调试onRestoreInstanceState(Bundle)
方法,但不知道如何.
我在我的应用中使用了YouTubePlayerAPI和YouTubePlayerSupportFragment,但是我收到了以下错误,但我找不到导致它的原因.我一直在寻找信息,但我没有找到任何有用的东西.
java.lang.IllegalStateException: YouTubeServiceEntity not initialized
at android.os.Parcel.readException(Parcel.java:1433)
at android.os.Parcel.readException(Parcel.java:1379)
at com.google.android.youtube.player.internal.l$a$a.a(Unknown Source)
at com.google.android.youtube.player.internal.o.a(Unknown Source)
at com.google.android.youtube.player.internal.ad.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source)
at com.google.android.youtube.player.internal.r.g(Unknown Source)
at com.google.android.youtube.player.internal.r$c.a(Unknown Source)
at com.google.android.youtube.player.internal.r$b.a(Unknown Source)
at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
在stackstrace中,没有任何行号指向我的任何类或活动.
有什么想法吗?
谢谢!
编辑
我的自定义YoutubePlayerFragment类:YouTubeVideoPlayerFragment.java
public class YouTubeVideoPlayerFragment extends YouTubePlayerSupportFragment {
private static final String ARG_URL = "url";
// …
Run Code Online (Sandbox Code Playgroud) 如何通过代码在ics中启用"不要保持活动"选项.如果已启用,则如何阻止该活动.
注意:我在我的应用程序中使用了更多活动.因为我将一个活动移动到另一个活动,所以第一个活动被销毁.我可以将我的数据保存在onSaveInstanceState上.没有使用保存的实例状态有任何方法可以做...
提前致谢..
我们使用 NFC 标签作为进出的停车票。在每个入口处,标签上都会写入一些数据,而在出口处,该数据会验证车辆的出口。
\n\n部分车辆进出后,NfcService失效,智能手机无法检测到NFC标签。设备需要重新启动才能重新启动 NfcService,然后设备再次开始正常工作。
\n\n此错误是随机出现的,我们无法在开发环境中重现此错误,但我们在停车场出入口安装的设备上多次观察到此问题。
\n\n\n\n当我们调试这个问题时,我们能够以某种方式管理上述日志。
\n\n我们尝试了不同的更改,例如使用enableReaderMode
而不是enableForegroundDispatch
,但问题仍然存在。
public void enableReaderMode() {\n try {\n Log.d("WTF", "Enabling reader mode");\n NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this);\n\n if (nfc != null) {\n int flags = NfcAdapter.FLAG_READER_NFC_A ;\n\n nfc.enableReaderMode(this, new NfcAdapter.ReaderCallback() {\n @Override\n public void onTagDiscovered(Tag tag) {\n runOnUiThread(new Runnable() {\n @Override\n public void run() {\n Log.d("WTF", "Tag discovered");\n String uid = ByteArrayToHexString(tag.getId());\n Toast.makeText(MainActivity.this, getString(R.string.message_tag_detected), Toast.LENGTH_SHORT).show();\n Ndef ndef = Ndef.get(tag);\n\n if (isNFCDialogDisplayed) {\n\n if (isWrite) {\n\n …
Run Code Online (Sandbox Code Playgroud) 这是Android Lollipop 5.0的一个奇怪的行为.我有两个活动,A和B. A启动活动B.当我点击后退按钮时,在活动B中,Android在A上调用onCreate方法.此行为仅在Lollipop 5.0中可观察到.在其他版本中,onCreate在完成另一个活动后从未被调用.
问题是什么?
这是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.example"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<application
android:name=".Application"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppThemeMaterial" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name=".activities.ActivityA"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.ActivityB"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/activityB" >
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-activity android-5.0-lollipop
因此,在我的应用程序中,我有一个打开 Gmail 的按钮,以便用户可以检查验证码。
我用这个代码打开gmail:
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_APP_EMAIL)
try {
activity?.startActivity(intent)
} catch (e: Exception) {
activity?.let {
AlertDialog.Builder(it)
.setTitle("Email App Not Found")
.show()
}
}
Run Code Online (Sandbox Code Playgroud)
启动 Gmail 效果很好,但我需要的是后退按钮返回我的应用程序。
目前,当我点击 gmail 的后退按钮时,它将最小化我的应用程序,然后重新打开我的应用程序只会重新打开 gmail,无法在不完全关闭并重新打开它的情况下返回到我的应用程序。
有没有办法覆盖后退按钮以从 Gmail 返回我的应用程序?
android ×7
android-4.0-ice-cream-sandwich ×1
kotlin ×1
lifecycle ×1
ndef ×1
nfc ×1
youtube-api ×1