android - Crashlytics 和 AsyncTask

标签 android crashlytics

我正在将 Crashlytics 添加到应用程序中,并运行了几个测试。当我在异步任务中抛出异常时,报告没有出现在控制台中。这是一个已知问题还是应该解决?

AsyncTask.execute(new Runnable()) {
    @Override public void run() {
        throw new RuntimeException("THIS IS A TEST");
    }
 }

我知道 Crashlytics 设置正确,因为从同一函数抛出但在 AsyncTask 包装器之外的异常显示得很好。 任何人都可以分享他们对异步发生的崩溃的经验吗?

更新 我运行了更多测试,我发现我的部分问题是我有一个未捕获异常的处理程序。我已经准备好了,所以测试人员会看到一个对话框,他们只需点击确定即可将 logcat 附加到电子邮件中。 (感谢 need-to-handle-uncaught-exception-and-send-log-file)我尝试了很多东西,在我的情况下,我只需要选择一个,未捕获的异常处理程序或 crashlytics。它以这种方式对我有用,因为我真的只希望 crashlytics 用于生产 + 发布变体。 我尝试在异常处理程序的主体中包含 Crashlytics.logException(e) 但这没有用。可能是因为该函数紧接着调用了 System.exit(1)。无论如何......这就是我现在所拥有的。

要使用自定义应用程序类,请更新 list

    <application
    android:name=".util.App"

在 App 类中,我设置了未捕获的异常处理程序或 crashlytics。

public class App extends Application {
    public void onCreate() {
            super.onCreate();

            Constants.IS_DEV = BuildConfig.FLAVOR.equals("dev");

            if (Constants.IS_DEV || BuildConfig.DEBUG) {
                    setupUncaughtExceptionHandler();
            } else {
                    Fabric.with(this, new Crashlytics());
            }
            [SNIP]
    }

    private void setupUncaughtExceptionHandler() {

            // Setup handler for uncaught exceptions.
            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException(Thread thread, Throwable e) {
                            handleUncaughtException(thread, e);
                    }
            });

    }

    public void handleUncaughtException(Thread thread, Throwable e) {

            // Crashlytics.logException(e); did not work here

            // create intent to launch new instance and show 'send_log' dialog
            Intent intent = new Intent();
            intent.setAction(BuildConfig.APPLICATION_ID + ".SEND_LOG");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            System.exit(1); // kill this instance
    }

    [SNIP]
}

我的测试只是我在设置页面中抓取的功能。它们只是将 onClick 方法设置为“onClick”的文本项(多么原始:)

public class SettingsActivity extends DataSourcedActivity {

    [SNIP]

    public void onClick(View view) {
            if (view == findViewById(R.id.txtSettingsRemove)) {
                    launchRemoveItemsPage();
            } else if (view == findViewById(R.id.txtSettingsRestorePurch)) {
                    launchRestorePurchases();
            } else if (view == findViewById(R.id.txtContactSupport)) {
                    launchContactSupport();
            } else if (view == findViewById(R.id.txtGetUpdates)) {
                    launchGetUpdates();
            } else {
                    throw new DevException(Constants.UNKNOWN_SETTINGS_OPTION);
            }
    }

    private void launchRemoveCollectionsPage() {
            AsyncTask.execute(new Runnable()) {
                    @Override
                    public void run() {
                            throw new RuntimeException("THIS IS AN ASYNCHRONOUS TEST");
                    }
            }
            [SNIPPED ORIGINAL CONTENTS OF FUNCTION]
    }

    private void launchRestorePurchases() {
            throw new RuntimeException("THIS IS A TEST");
            [SNIPPED ORIGINAL CONTENTS OF FUNCTION]
    }

    [SNIP]
}

当我尝试同时使用 Crashlytics 和 uncaughtException 处理程序时,我得到了不同的结果,具体取决于我首先设置的是哪个。如果我先设置 Crashlytics,然后再设置我的 uncaughtExceptionHandler,那么我的似乎覆盖了 Crashlytics,没有崩溃报告发送到控制台。如果我先设置我的 uncaughtExceptionHandler,那么我会在控制台上收到崩溃报告。

所以我把它留在这里以防万一它可能对遇到这个问题的其他人有所帮助。

迈克

最佳答案

崩溃发生在下一次后续发射时。崩溃会在本地记录下来,然后在您下次启动“相同的构建或应用程序”时,它会在启动时发送报告。

请确保您正确启动 crashlytics,并确保您从设备上的同一个应用程序再次启动该应用程序以确保它被发送。从调试器中一次又一次地点击播放可能会产生将问题发送到仪表板的不良结果。

此外,在调试中,您可能会发现发布稍微有些延迟,我之前看到它最多需要 5 分钟。

关于android - Crashlytics 和 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47598474/

相关文章:

Android: 如何在 ViewPager 中创建不同的 View ?

java - 我可以在实例字段中存储 View 对象吗?

reactjs - 我们如何在 react-native 中将崩溃错误发送到自己的服务器

Crashlytics Fabric 多个目标

ios - iOS 中的 Crashlytics 不会继续处理 Fabric 应用程序中的 "Build Your Project"

android - 不要关闭点击 map 上的信息窗口。 (谷歌地图安卓 API V2)

java - 当 AsyncTask 也使用另一个线程时如何设置延迟时间?

android - react native Android Firebase Crashlytics : Must Initialize Fabric before Using singleton()

android - 我该如何解决? `Failed to resolve: com.crashlytics.sdk.android:crashlytics:com.crashlytics.tools.gradle`

java - android.widget.RelativeLayout android 不正确调用 requestLayout()