-1

在显示我的启动活动并重定向到下一个活动后,在显示下一个活动后它会崩溃。我试图删除启动画面可绘制图像,但没有帮助。我还尝试记录以查看它在哪里崩溃,我看到它创建了下一个活动,将 WebView 加载到其中,并且在 SplashActivity 的 onDestroy() 之后它崩溃了。这里真正值得注意的是,它只在小于 28 和 28 及更高版本的 Android API 上崩溃,它可以正常工作。这是我的飞溅活动:

package io.mediaworks.android.controllers;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.google.android.material.snackbar.Snackbar;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import io.mediaworks.android.App;
import io.mediaworks.android.BuildConfig;
import io.mediaworks.android.R;
import io.mediaworks.android.controllers.articles.ArticlesActivity;
import io.mediaworks.android.notifications.NotificationPresenter;
import io.mediaworks.android.notifications.fcm.TopicsRepository;
import io.mediaworks.android.request.RequestModel;
import io.mediaworks.android.request.model.ArticleSearchResult;
import io.mediaworks.android.request.model.Language;
import io.mediaworks.android.request.model.MenuItem;
import io.mediaworks.android.request.model.MenuType;
import io.mediaworks.android.request.model.Options;
import io.mediaworks.android.request.model.Settings;
import io.mediaworks.android.request.model.Topic;
import io.mediaworks.android.utils.Constants;
import io.mediaworks.android.utils.LanguageManager;

public class SplashActivity extends BaseActivity implements Response.Listener<Settings>, Response.ErrorListener {

    private static final String TAG = "SplashActivity";
    private View view;
    private boolean offlineMode = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(view = new View(this));
        loadContent();
    }

    private void loadContent() {
        new RequestModel<>(SplashActivity.this, Request.Method.GET, BuildConfig.BASE_URL + "getSettings", Settings.class, SplashActivity.this, SplashActivity.this);
    }

    @Override
    public void onResponse(Settings settings) {
        App.INSTANCE.setSettings(settings);

        // Should select language
        if (settings.getSelectedLanguage() == null && settings.options.multilanguage) {
            selectLanguage();
        } else {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    nextStep();
                }
            }, 1000);
        }
        offlineMode = false;
    }

    private void selectLanguage() {
        new AlertDialog.Builder(this).setItems(App.INSTANCE.settings.getLanguageList(), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                LanguageManager.getInstance(SplashActivity.this).selectLanguage(App.INSTANCE.settings.languages[which].code);
                TopicsRepository.getInstance().setTopics();
                nextStep();
            }
        }).setCancelable(false).show();
    }

    @SuppressLint("CommitPrefEdits")
    @Override
    public void onErrorResponse(VolleyError error) {
        offlineMode = true;
        if(!App.INSTANCE.isPodcast() && !App.INSTANCE.isHanzaMedia() && !App.INSTANCE.isBanatSoft()) {
            Snackbar.make(view, this.getString(R.string.error_network_connection), Snackbar.LENGTH_INDEFINITE)
                .setAction(this.getString(R.string.retry), view -> {
                    loadContent();
                }).show();
            }
        else {
            Settings settings = new Settings();
            if(App.INSTANCE.isPodcast())
                settings = podcastOfflineModeSettings();
            else if(App.INSTANCE.isHanzaMedia())
                settings = hanzaMediaOfflineModeSettings();
            else if(App.INSTANCE.isBanatSoft())
                settings = banatSoftOfflineModeSettings();

            SharedPreferences sharedPreferences =
                    PreferenceManager.getDefaultSharedPreferences(App.INSTANCE);
            sharedPreferences.edit().putBoolean(Constants.PREF_KEY_OFFLINE_MODE, offlineMode).apply();

            LanguageManager languageManager = LanguageManager.getInstance(this);
            languageManager.selectLanguage(settings.languages[0].code);
            languageManager.applyLanguage();
            onResponse(settings);
        }
    }

    private void nextStep() {
        LanguageManager languageManager = LanguageManager.getInstance(this);
        languageManager.selectLanguage(App.INSTANCE.settings.languages[0].code);
        languageManager.applyLanguage();

        // Check if from notification
        if (NotificationPresenter.isFromNotification(getIntent().getExtras())) {
            startIntent(NotificationPresenter.getNotificationIntent(this, getIntent().getExtras()));
        }

        // Check deep link
        else if (getIntent().getData() != null && getIntent().getData().isHierarchical()
                && !TextUtils.isEmpty(getIntent().getDataString())) {

            Uri parse = Uri.parse(getIntent().getDataString());
            String param = parse.getQueryParameter("param");
            if (param != null && !TextUtils.isEmpty(param)) {
                try {
                    startIntent(ArticlesActivity.getIntent(this, Integer.parseInt(param), null));
                } catch (Exception e) {
                    e.printStackTrace();
                    startIntent(BrowserActivity.getIntent(this, getIntent().getData().toString()));
                }
            } else {
                final String url = getIntent().getData().toString();

                if(url.equals("http://podcast.rs")){
                    Intent main = new Intent(this,HomeActivity.class);
                    main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(main);
                    finish();
                    return;
                }
                new RequestModel<ArticleSearchResult>(this, Request.Method.POST, BuildConfig.BASE_URL + "getArticleId", ArticleSearchResult.class, new Response.Listener<ArticleSearchResult>() {

                    @Override
                    public void onResponse(ArticleSearchResult response) {
                        if (response.found) {
                            startIntent(ArticlesActivity.getIntent(SplashActivity.this, response.articleId));
                        } else {
                            startIntent(BrowserActivity.getIntent(SplashActivity.this, url));
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        startIntent(BrowserActivity.getIntent(SplashActivity.this, url));
                    }
                }) {
                    @Override
                    protected Map<String, String> getParams() {
                        Map<String, String> params = super.getParams();
                        if (params == null) {
                            params = new HashMap<>();
                        }
                        params.put("url", url);
                        return params;
                    }
                };
            }
        }else{
            startIntent(new Intent(this, HomeActivity.class));
        }

    }

    private void startIntent(Intent intent) {
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager
                = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        assert connectivityManager != null;
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }

    private Settings hanzaMediaOfflineModeSettings() {
        Settings settings = new Settings();

        settings.languages = new Language[1];
        settings.languages[0] = new Language();
        settings.languages[0].code = "hr";
        settings.languages[0].id = 1;
        settings.languages[0].name = "Croatian";

        settings.selectLanguage(settings.languages[0].code);

        settings.languages[0].leftMenus = new MenuItem[1];
        settings.languages[0].leftMenus[0] = new MenuItem();
        settings.languages[0].leftMenus[0].id = 8;
        settings.languages[0].leftMenus[0].title = "Sačuvani članci";
        settings.languages[0].leftMenus[0].sort = 8;
        settings.languages[0].leftMenus[0].type = MenuType.my_content;
        settings.languages[0].leftMenus[0].url = null;
        settings.languages[0].leftMenus[0].icon = null;
        settings.languages[0].leftMenus[0].rightMenu = new MenuItem[0];

        settings.languages[0].topMenus = new MenuItem[0];

        settings.languages[0].topics = new Topic[0];

        settings.options = new Options();
        settings.options.disableComments = false;
        settings.options.loadArticleFromUrl = false;
        settings.options.multilanguage = false;
        settings.options.showArticleZoom = false;
        settings.options.showSearchButton = false;
        settings.options.showSelectAllTopics = false;
        settings.options.has_bottom = false;

        settings.webViewCss = null;

        return settings;
    }

    private Settings banatSoftOfflineModeSettings() {
        Settings settings = new Settings();

        settings.languages = new Language[1];
        settings.languages[0] = new Language();
        settings.languages[0].code = "ro";
        settings.languages[0].id = 2;
        settings.languages[0].name = "Romania";

        settings.selectLanguage(settings.languages[0].code);

        settings.languages[0].leftMenus = new MenuItem[1];
        settings.languages[0].leftMenus[0] = new MenuItem();
        settings.languages[0].leftMenus[0].id = 8;
        settings.languages[0].leftMenus[0].title = "Conținutul meu";
        settings.languages[0].leftMenus[0].sort = 7;
        settings.languages[0].leftMenus[0].type = MenuType.my_content;
        settings.languages[0].leftMenus[0].url = null;
        settings.languages[0].leftMenus[0].icon = "ic_download";
        settings.languages[0].leftMenus[0].rightMenu = new MenuItem[0];

        settings.languages[0].topMenus = new MenuItem[0];

        settings.languages[0].topics = new Topic[0];

        settings.options = new Options();
        settings.options.disableComments = false;
        settings.options.loadArticleFromUrl = false;
        settings.options.multilanguage = false;
        settings.options.showArticleZoom = false;
        settings.options.showSearchButton = false;
        settings.options.showSelectAllTopics = false;
        settings.options.has_bottom = false;

        settings.webViewCss = null;

        return settings;
    }

    private Settings podcastOfflineModeSettings() {
        Settings settings = new Settings();

        settings.languages = new Language[1];
        settings.languages[0] = new Language();
        settings.languages[0].code = "sr";
        settings.languages[0].id = 1;
        settings.languages[0].name = "Serbian";

        settings.selectLanguage(settings.languages[0].code);

        settings.languages[0].leftMenus = new MenuItem[1];
        settings.languages[0].leftMenus[0] = new MenuItem();
        settings.languages[0].leftMenus[0].id = 46;
        settings.languages[0].leftMenus[0].title = "Offline";
        settings.languages[0].leftMenus[0].sort = 4;
        settings.languages[0].leftMenus[0].type = MenuType.podcasts;
        settings.languages[0].leftMenus[0].url = null;
        settings.languages[0].leftMenus[0].icon = "ic_download";
        settings.languages[0].leftMenus[0].rightMenu = new MenuItem[0];

        settings.languages[0].topMenus = new MenuItem[0];

        settings.languages[0].topics = new Topic[0];

        settings.options = new Options();
        settings.options.disableComments = false;
        settings.options.loadArticleFromUrl = false;
        settings.options.multilanguage = false;
        settings.options.showArticleZoom = false;
        settings.options.showSearchButton = false;
        settings.options.showSelectAllTopics = false;
        settings.options.has_bottom = false;

        settings.webViewCss = "div#cookie-notice {\r\ndisplay: none;\r\n}\r\nfooter#site-footer {\r\ndisplay: none;\r\n}\r\ndiv#secondline-themes-header-position {\r\n    display: none;\r\n}";

        return settings;
    }

}

这是我得到的例外:

W/System.err: java.lang.RuntimeException: Canvas: trying to draw too large(108712800bytes) bitmap.
W/System.err:     at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:229)
        at android.view.RecordingCanvas.drawBitmap(RecordingCanvas.java:78)
        at org.chromium.android_webview.JavaBrowserViewRendererHelper.drawBitmapIntoCanvas(JavaBrowserViewRendererHelper.java:50)
        at org.chromium.android_webview.AwContents.nativeOnDraw(Native Method)
        at org.chromium.android_webview.AwContents.access$5100(AwContents.java:103)
W/System.err:     at org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDraw(AwContents.java:3086)
        at com.android.webview.chromium.WebViewChromium.onDraw(WebViewChromium.java:28365)
        at android.webkit.WebView.onDraw(WebView.java:2790)
        at android.view.View.draw(View.java:19123)
        at android.view.View.updateDisplayListIfDirty(View.java:18073)
        at android.view.View.draw(View.java:18851)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
        at android.view.View.draw(View.java:19126)
        at androidx.core.widget.NestedScrollView.draw(NestedScrollView.java:1998)
W/System.err:     at android.view.View.updateDisplayListIfDirty(View.java:18073)
        at android.view.View.draw(View.java:18851)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
        at android.view.View.draw(View.java:19126)
        at android.view.View.updateDisplayListIfDirty(View.java:18073)
        at android.view.View.draw(View.java:18851)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
        at android.view.View.updateDisplayListIfDirty(View.java:18064)
        at android.view.View.draw(View.java:18851)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4214)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4000)
W/System.err:     at android.view.View.updateDisplayListIfDirty(View.java:18064)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
W/System.err:     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
W/System.err:     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
W/System.err:     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
W/System.err:     at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
W/System.err:     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
        at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4198)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4178)
W/System.err:     at android.view.View.updateDisplayListIfDirty(View.java:18032)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:643)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:649)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:757)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2980)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2794)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2347)
W/System.err:     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
A/chromium: [FATAL:jni_android.cc(243)] Please include Java exception stack in crash report

任何帮助表示赞赏。

4

1 回答 1

-1

我已经通过在我的 AndroidManifest 文件中设置解决了这个问题android:hardwareAccelerated="false",并且为了更快、更流畅的图像渲染,如果 Android 版本高于 27,我已经在我的基本活动中以编程方式将其更改为 true。我希望我帮助了某人:)

更新 很抱歉没有更新答案。android:hardwareAccelerated="false" 标志帮助我避免了上述崩溃,但这只是一种解决方法,它在应用程序中产生了一些其他问题。导致问题的真正原因实际上是 NestedScrollView。起初将 android:transitionGroup="true" 放入其中,使该应用程序可以在某些设备上运行,但问题仍然存在。所以最终的解决方案是去掉 NestedScrollView。我发现它在 SwipeRefreshLayout 或 NestedScrollView 内的 WebView 中的某个地方(我不确定,因为它是很久以前的)可能会导致麻烦。希望这有帮助!

于 2020-12-21T12:41:17.157 回答