gpt4 book ai didi

android - 捕获 "Unfortunately ' 应用程序'已停止工作“错误

转载 作者:行者123 更新时间:2023-12-03 08:29:07 27 4
gpt4 key购买 nike

我在 Android 上使用了一个非常不稳定的库,它偶尔会崩溃。我使用 startActivity() 启动它在我的代码中。

代码的不稳定部分是进行大量视频处理并将结果上传到服务器。我真的不介意 Activity 是否崩溃,但我需要通知服务器它确实崩溃了。

崩溃来自内存泄漏(还没有时间解决它)。有没有办法可以捕获错误并显示更友好/有趣的消息?

try {
context.startActivity(intent);
} catch (ApplicationCrashedException e) {
server.notifyServerOfCrash();
toast("I really disliked your face...");
}

编辑:这是错误:
java.lang.OutOfMemoryError
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at java.nio.MemoryBlock.allocate(MemoryBlock.java:125)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:72)
at io.cine.android.streaming.FFmpegMuxer.writeSampleData(FFmpegMuxer.java:151)
at io.cine.android.streaming.AndroidEncoder.drainEncoder(AndroidEncoder.java:128)
at io.cine.android.streaming.TextureMovieEncoder.handleFrameAvailable(TextureMovieEncoder.java:264)
at io.cine.android.streaming.TextureMovieEncoder$EncoderHandler.handleMessage(TextureMovieEncoder.java:409)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at io.cine.android.streaming.TextureMovieEncoder.run(TextureMovieEncoder.java:219)
at java.lang.Thread.run(Thread.java:841)

出于某种原因, BroadcastActivity内存不足,Activity 被杀死并返回到前一个。然后它显示“应用程序”已停止工作对话框。如果我按 OK,它会终止整个应用程序并返回主屏幕。

理想情况下,我只会让它回到之前的 Activity ,以静默方式通知服务器。 (不杀死应用程序)

最佳答案

Is there a way I can catch the error a display a more friendly/funny message instead?



如果应用程序泄漏太多内存而导致崩溃,您将无法轻易捕捉到这一点。

为什么你不能总是捕获这个

当您开始耗尽内存时,应用程序代码的任何部分尝试分配比可用内存更多的内存都会引发异常。所以不仅仅是你的库会抛出异常。

你怎么能检测到这个

捕获 OutOfMemoryError 并努力告诉用户/服务器

您的结果会有所不同,但您可以包装 Threadrun()带有 try catch 的方法配对并 try catch 内存不足错误。您仍然会内存不足,并且您在 catch 代码中所做的任何事情都可能因此而失败。如果进程经常分配大块内存,它仍然可能会起作用,这意味着还有一点点剩余。

例子:
public void run() {
try {
//video process code
} catch (OutOfMemoryError error) {
//we are still out of memory so these operations might fail
tellServerWeFailed();
triggeruserDialog();
}
}

onTrimMemory() 覆盖

您也可以尝试在 onTrimMemory() 时停止视频任务。叫做。您的里程可能会有所不同,我从来没有能够让它在不同的 Android 设备上一致地工作。

错误报告框架

一个相当复杂的解决方案是使用第三方错误报告框架,因为它们通常会让您向用户显示自定义崩溃消息。

查看 http://www.acra.ch/尤其是关于 User Messages 的文档

开始服务

I do not really mind if the activity crashes, but I need to signal the server that it did.



伟大的!您可能会尝试使用在崩溃后 android 会自动重新启动的已启动服务。如何告诉您的服务器的详细信息由您决定。您可能会发现您需要保存一些 token 或其他信息,以便您可以告诉您的服务器哪个 session 已结束,例如,您可能会始终将该信息保存在 Preference 条目中并在崩溃后将其读出。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(LOG_TAG, "Received start id " + startId + ": " + intent);
if (intent == null) {
Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. ");
//Tell your server about the crash.
stopSelf();
}
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}

http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

更多关于 Android 内存不足的信息

To maintain a functional multi-tasking environment, Android sets a hard limit on the heap size for each app. The exact heap size limit varies between devices based on how much RAM the device has available overall. If your app has reached the heap capacity and tries to allocate more memory, it will receive an OutOfMemoryError.

In some cases, you might want to query the system to determine exactly how much heap space you have available on the current device—for example, to determine how much data is safe to keep in a cache. You can query the system for this figure by calling getMemoryClass(). This returns an integer indicating the number of megabytes available for your app's heap. This is discussed further below, under Check how much memory you should use. (source)



一些关键点:
  • 您的整个应用程序共享系统分配的内存堆。
  • 一旦你泄露了内存,它就会消失,直到应用程序重新启动。
  • 您将无法通过离开该 Activity 来隔离该 Activity 中泄漏的内存。
  • 关于android - 捕获 "Unfortunately ' 应用程序'已停止工作“错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149013/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com