我想知道当应用程序最小化时,Android 系统是否能够在没有整个应用程序进程的情况下终止该活动。从Android文档中我们知道,onDestroy只有当activity即将被销毁时才会被调用,并且系统保证在将要杀死activity时调用此方法,只有在整个应用程序进程被杀死时才不会被调用。
因此,想象这样一种情况 - 您将应用程序发送到后台(最小化),一段时间后操作系统开始内存不足并决定终止该活动,但由于应用程序当前已挂起并且无法执行代码,因此它不是能够调用它的onDestroy方法,尽管保证它会在每个活动销毁之前被调用。
因此,这种推理让我想到,当应用程序处于后台时,操作系统只能杀死整个进程,而不能杀死某些特定活动。我的推理正确吗,还是我错过了什么?
android android-lifecycle android-activity android-memory android-ondestroy
我在stackoverflow中遇到了很多关于这个错误的问题,但是他们没有找到解释我的方案的正确解决方案.
在我的Android应用程序中,我必须允许用户单击按钮以打开图库并选择图像.然后需要将特定的选定图像加载到我的布局(UI)中的ImageView.
这样做很好.以下是我用来实现此目的的代码.
在上传按钮中单击 - >
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), REQUEST_UPLOAD_IMG);
Run Code Online (Sandbox Code Playgroud)
然后onActivityResult - >
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
//super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK)
{
if(requestCode==REQUEST_UPLOAD_IMG)
{
Uri selectedImageURI = data.getData();
uploadImgVW.setImageURI(selectedImageURI);
}
else
{
Toast.makeText(MainActivity.this, "You can only select an Image.", Toast.LENGTH_LONG).show();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果用户选择具有更大尺寸的图像(如2MB大小),应用程序将退出并出现以下错误.但是正常(KB级别)图像非常好,并且想知道我能为此问题做些什么(处理这种错误情况).谢谢...
错误 - >
06-20 16:43:58.445: E/AndroidRuntime(2075): FATAL EXCEPTION: main
06-20 16:43:58.445: E/AndroidRuntime(2075): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
Run Code Online (Sandbox Code Playgroud) 如果Service在不同的进程中运行(通过:name清单内的 \xe2\x80\x9c \xe2\x80\x9d)并带有前台标志。当系统想要释放一些内存时..(想象一下繁重的用户界面,用户按主页并导航到其他繁重的应用程序)
它会仅杀死该应用程序的主进程以释放资源吗?(显然保持服务进程完好无损),然后just当用户导航回应用程序时重新启动主进程。
如果Service运行在同一个进程中,它会释放除前台服务之外的所有资源(例如活动)吗?或者在这种情况下整个进程(带有大量用户界面)将被视为前台,因此消耗大量内存并且对用户手机不利
聚苯乙烯
\n\n据我所知,对前台服务没有任何保证。\n http://developer.android.com/reference/android/app/Service.html
\n\n我了解立即杀死进程的android设计\n(这回答了第二个问题,但想确定)
\n\nhttp://android-developers.blogspot.com/2010/04/multitasking-android-way.html
\n我正面临内存泄漏.所以,我heap dump为我的应用程序捕获了一个,并尝试使用Memory Analyzer Tool(MAT)进行分析.我点击菜单中的堆转储概览选项hprof file.然后,点击Class Histogram.它向我展示了按类分组的所有对象列表,它们占据了最大值.其中一个是我的cutom hashmap.现在,我想分析一下这个条目hashmap.
知道我怎么能这样做吗?如果我单击自定义散列映射名称,然后单击List Objects->with incoming references,它只显示hashmap创建这些对象的层次结构中的所有对象的列表,而不是散列映射条目的实际键值对.
PS我的自定义Hashmap:
private Hashmap<Integer, TextCache> mCache;
class TextCache{
Bitmap bitmap;
int left;
int right;
int keyCode;
}
Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中加载两个共享库(第三方)。我需要检查每个库的内存占用,并在此基础上决定最终使用哪个库。
有什么方法可以查看这两个 so libs 中的每一个的确切内存使用情况吗?
PS 我环顾四周,但找不到这个特定问题的答案。
看官方文档上关于如何释放Android MediaPlayer实例的例子,上面说释放后要使该对象无效:
以下是您应该如何释放并取消 MediaPlayer:
mediaPlayer.release();
mediaPlayer = null; // <-- instruction I am asking about.
Run Code Online (Sandbox Code Playgroud)
这实际上有必要吗?如果是这样,为什么?
来源: https ://developer.android.com/guide/topics/media/mediaplayer.html#releaseplayer
就我而言,我有两个名为 A(主要活动)和 B(子活动)的活动。A 将启动 B(B 使用 Glide 图像库加载一些图像)。
如果我使用 android 内存监视器获得内存分配,我可以清楚地看到内存分配增长。这完全没问题,因为我们在活动 B.Image Attached 中做了一些与图像相关的事情。
所以我的问题是,如果我在活动 B 中按下后退按钮,它将进入活动 A 并且分配的内存不会被清除。内存分配仍将是相同的数量。
这是正常的安卓行为吗?
如果不是,我如何手动清理内存?
我手动运行GC如下,但同样的结果没有运气:(。
在活动 B
@Override
protected void onDestroy() {
super.onDestroy();
System.gc();
}
Run Code Online (Sandbox Code Playgroud) 自从2009 AsyncTask年在Cupcake(API 3,Android 1.5)中推出以来,它一直被Android团队一直推广为:
他们提供的代码示例强化了这种简单的信息,特别是对于那些不得不以更痛苦的方式使用线程的人.AsyncTask非常有吸引力.
然而,在此后的许多年里,崩溃,内存泄漏和其他问题困扰了大多数选择AsyncTask在其生产应用程序中使用的开发人员.这通常是由于Activity 破坏和娱乐上运行时配置的变化(特别是取向/旋转),而AsyncTask运行doInBackground(Params...); 当onPostExecute(Result)被调用时,Activity已经被破坏,使UI引用处于不可用状态(或甚至null).
Android团队在这个问题上缺乏明显,清晰,简洁的指导和代码样本只会让事情变得更糟,导致混乱以及各种变通方法和黑客攻击,有些体面,有些可怕:
显然,既然AsyncTask可以在很多情况下使用,那么就没有一种方法可以解决这个问题.然而,我的问题是关于选择.
什么是规范(由Android团队认可)最佳实践,使用简洁的代码示例,AsyncTask与Activity/ Fragmentlifecycle 集成并在运行时配置更改时自动重启?
android android-lifecycle android-configchanges android-asynctask android-memory
我有多个文件的录音.我正在使用com.googlecode.mp4parser:isoparser:1.0.2库创建一个连续的音频文件.
以下是我的代码:
String mediaKey = isAudio ? "soun" : "vide";
List<Movie> listMovies = new ArrayList<>();
for (String filename : sourceFiles) {
listMovies.add(MovieCreator.build(filename));
}
List<Track> listTracks = new LinkedList<>();
for (Movie movie : listMovies) {
for (Track track : movie.getTracks()) {
if (track.getHandler().equals(mediaKey)) {
listTracks.add(track);
}
}
}
Movie outputMovie = new Movie();
if (!listTracks.isEmpty()) {
outputMovie.addTrack(new AppendTrack(listTracks.toArray(new Track[listTracks.size()])));
}
Container container = new DefaultMp4Builder().build(outputMovie);
FileChannel fileChannel = new RandomAccessFile(String.format(targetFile), "rw").getChannel();
container.writeContainer(fileChannel);
fileChannel.close();
Run Code Online (Sandbox Code Playgroud)
以上代码在Android手机上运行.由于其移动环境,每个应用程序都有内存限制.
上面代码的问题是当我从文件加载Movie并为小文件创建一个轨道列表时它工作正常.但随着文件大小的增加,操作开始变得无响应.它需要大量的内存.如何才能提高内存效率.他们是否可以像在Java中进行文件复制操作那样在小流中执行此操作?
更新:
为了在文件中录制音频,我使用androidMediaRecorder进行此操作,输出格式为 …
IAM试图使用Android Studio的终端触发内存不足事件:
To trigger your onTrimMemory callbacks:
adb shell am send-trim-memory
e.g. adb shell am send-trim-memory com.example.app MODERATE
Run Code Online (Sandbox Code Playgroud)
但是我收到此消息Unknown command'send-trim-memory'。Iam在最新的android上使用模拟器。
谢谢