android - 切换 fragment 时 OKHttp 崩溃

标签 android android-fragments okhttp android-runonuithread

我没有接受过正规的编码教育,所以如果我做的事情被认为是糟糕的编码,请告诉我

我正在为我正在制作的火车时刻表应用程序使用底部导航 View 。其中一个选项是附近的功能 - 当点击底部抽屉导航上的附近时,NearbyFragment 启动,我的服务器自动通过 OKHttp 获取请求,无需额外的用户交互

问题是,如果您从附近切换到底部导航 View 上的另一个按钮,或者如果您多次点击附近的按钮,应用程序就会崩溃。最初,这是因为 runOnUiThread 方法无法找到 UI 线程,因为我转到了另一个 fragment (并且可能主线程不再存在)。我尝试通过在 onViewCreated 中调用 getLocation 方法之前创建 1 秒延迟来解决此问题

// Delay before calling on location to prevent crashing when rapidly switching from Nearby Fragment
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (getActivity() != null) {
                    getLocation();
                }
            }
        }, 1000);

我还在 if 语句 (getActivity != null) 中包装了上述内容以及 OKHttp onSuccess 和 onFailure 方法,以在继续之前检查 UI 线程是否仍然存在

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    if (getActivity() != null) {
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                processJSON(myResponse);
                            }
                        });
                    }
                }
            }

如果我在加载 1 秒后但加载完成之前从 NearbyFragment 更改为不同的 fragment ,我仍然会遇到与带有 NullPointerExceptions 的 onFailure 方法相关的崩溃并且找不到 View (例如 snackbar ),所以我包装try/catch 中的 onFailure 以捕获所有异常并忽略它们。这感觉像是一个黑客,但当通过底部导航从 NearbyFragment 切换到另一个 fragment 时,我的应用程序不再崩溃/按预期运行。

@Override
            public void onFailure(Call call, IOException e) {
                try {
                    mSwipeToRefresh.setRefreshing(false);
                    Log.e("Main", e.toString());
                    mSnackbar = Snackbar.make(getActivity().findViewById(R.id.swipe_container_nearby), "ERROR!", Snackbar.LENGTH_INDEFINITE);
                    snackBarCoordinator(mSnackbar);
                    mSnackbar.show();
                } catch (Exception j) {
                    Log.e("Failed Get Closest Stations ", j.toString());
                }
            }

有没有更清洁的方法可以在不结合三个故障保护的情况下停止崩溃,即 handler.postDelayed、(getActivity() != null) 和一个空的 try/catch block ?

最佳答案

了解 UI 上是否有 Activity 或 Fragment。

对于Activity,可以调用isFinishing() 对于 fragment 调用 isAttached()

即在显示加载器、 snackbar 或任何用 if(...) 包装的小部件之前{}

if(isAttached()) { snackbar.show(); }

关于android - 切换 fragment 时 OKHttp 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791418/

相关文章:

安卓音频处理?

android - 使用 ImageMagick 显示 NV21 图像

android - 转到 ViewPager 中的下一页

android - 带有 ViewPager 的 ActionBarSherlock 在进入和返回 backstack 时不调用 ViewPager fragment 生命周期方法

android - 使用OKHttp,AsyncTask中的同步请求和OKhttp异步请求有什么区别?

java - Android - 从相对布局中删除 ImageView

Android 应用程序结构 : DLC via in-app billing

android - 在 AsyncTask 中保留对 Fragment 的强引用是否安全?

android - 在协程中使用 OkHTTPClient() 总是抛出警告 "inappropriate blocking method called"

android - Retrofit 2 发送重复参数