标签: android-memory

当应用程序在后台运行时,Android 可以在不终止整个进程的情况下终止 Activity 吗?

我想知道当应用程序最小化时,Android 系统是否能够在没有整个应用程序进程的情况下终止该活动。从Android文档中我们知道,onDestroy只有当activity即将被销毁时才会被调用,并且系统保证在将要杀死activity时调用此方法,只有在整个应用程序进程被杀死时才不会被调用。

因此,想象这样一种情况 - 您将应用程序发送到后台(最小化),一段时间后操作系统开始内存不足并决定终止该活动,但由于应用程序当前已挂起并且无法执行代码,因此它不是能够调用它的onDestroy方法,尽管保证它会在每个活动销毁之前被调用。

因此,这种推理让我想到,当应用程序处于后台时,操作系统只能杀死整个进程,而不能杀死某些特定活动。我的推理正确吗,还是我错过了什么?

android android-lifecycle android-activity android-memory android-ondestroy

6
推荐指数
1
解决办法
2680
查看次数

Android错误:java.lang.OutOfMemoryError:位图大小超过VM预算

我在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)

android android-image android-imageview android-memory

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

Android 内存不足时前台服务(不同进程/同一进程)的行为方式

如果Service在不同的进程中运行(通过:name清单内的 \xe2\x80\x9c \xe2\x80\x9d)并带有前台标志。当系统想要释放一些内存时..(想象一下繁重的用户界面,用户按主页并导航到其他繁重的应用程序)

\n\n
    \n
  1. 它会仅杀死该应用程序的主进程以释放资源吗?(显然保持服务进程完好无损),然后just当用户导航回应用程序时重新启动主进程。

  2. \n
  3. 如果Service运行在同一个进程中,它会释放除前台服务之外的所有资源(例如活动)吗?或者在这种情况下整个进程(带有大量用户界面)将被视为前台,因此消耗大量内存并且对用户手机不利

  4. \n
\n\n

聚苯乙烯

\n\n

据我所知,对前台服务没有任何保证。\n http://developer.android.com/reference/android/app/Service.html

\n\n

我了解立即杀死进程的android设计\n(这回答了第二个问题,但想确定)

\n\n

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

\n

android android-service android-lifecycle android-memory

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

如何使用Eclipse Memory Analyzer Tool(MAT)分析hashmap

我正面临内存泄漏.所以,我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)

java eclipse memory android android-memory

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

如何找到每个so库的内存使用情况?

我正在我的应用程序中加载两个共享库(第三方)。我需要检查每个库的内存占用,并在此基础上决定最终使用哪个库。

有什么方法可以查看这两个 so libs 中的每一个的确切内存使用情况吗?

PS 我环顾四周,但找不到这个特定问题的答案。

android shared-libraries android-library android-memory

5
推荐指数
0
解决办法
350
查看次数

发布时是否需要将Android MediaPlayer播放器设置为null?

看官方文档上关于如何释放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

java android android-mediaplayer android-memory

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

为什么android在完成活动后不清理内存?

就我而言,我有两个名为 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)

java android memory-management android-memory android-glide

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

AsyncTask和运行时配置更改:Android团队认可哪些方法,简洁的代码示例?

自从2009 AsyncTask年在Cupcake(API 3,Android 1.5)中推出以来,它一直被Android团队一直推广为:

他们提供的代码示例强化了这种简单的信息,特别是对于那些不得不以更痛苦的方式使用线程的人.AsyncTask非常有吸引力.

然而,在此后的许多年里,崩溃,内存泄漏和其他问题困扰了大多数选择AsyncTask在其生产应用程序中使用的开发人员.这通常是由于Activity 破坏和娱乐上运行时配置的变化(特别是取向/旋转),而AsyncTask运行doInBackground(Params...); 当onPostExecute(Result)被调用时,Activity已经被破坏,使UI引用处于不可用状态(或甚至null).

Android团队在这个问题上缺乏明显,清晰,简洁的指导和代码样本只会让事情变得更糟,导致混乱以及各种变通方法和黑客攻击,有些体面,有些可怕:

显然,既然AsyncTask可以在很多情况下使用,那么就没有一种方法可以解决这个问题.然而,我的问题是关于选择.

什么是规范(由Android团队认可)最佳实践,使用简洁的代码示例,AsyncTaskActivity/ Fragmentlifecycle 集成并在运行时配置更改时自动重启?

android android-lifecycle android-configchanges android-asynctask android-memory

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

通过使用带有内存限制的com.googlecode.mp4parser添加轨道来从文件创建影片?

我有多个文件的录音.我正在使用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进行此操作,输出格式为 …

android movie android-memory mp4parser

5
推荐指数
0
解决办法
482
查看次数

未知命令'send-trim-memory'Android

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上使用模拟器。

谢谢

android android-memory

5
推荐指数
0
解决办法
400
查看次数