[OKHttp在切换片段时崩溃

问题描述 投票:1回答:1

我没有接受过正规的编码教育,所以请让我知道我做过的事情是否被认为是不好的编码

我正在为正在制作的火车时刻表应用程序使用底部导航视图。选项之一是“附近”功能-单击底部导航抽屉上的“附近”时,将启动NearestFragment,并且我的服务器会自动通过OKHttp接收请求,而无需其他用户交互

问题是,如果从底部导航视图上的“附近”切换到另一个按钮,或者多次点击附近的按钮,则该应用程序将崩溃。最初,这是因为因为我进入了另一个片段(并且可能不再存在主线程),所以runOnUiThread方法无法找到UI线程。我尝试通过在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);

我还将上述内容以及OKHttp onSuccess和onFailure方法包装在if语句中(getActivity!= null),以在继续操作之前检查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秒后但在加载完成之前,我从NearestFragment更改为另一个片段,我仍然会与带有NullPointerExceptions的onFailure方法相关联的崩溃,并且无法找到视图(例如小吃栏)。因此,尝试/捕获中的onFailure可以捕获所有异常并忽略它们。这感觉像是一种黑客攻击,但是当通过底部导航从NearestFragment切换到另一个片段时,我的应用程序不再崩溃/无法正常工作。

@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块的组合)的情况下停止崩溃?

我没有接受过正规的编码培训,所以请让我知道我做过的事情是否被认为是不好的编码,我正在为正在制作的火车时刻表应用程序使用底部导航视图。 ...

android android-fragments okhttp android-runonuithread
1个回答
0
投票

要知道活动或片段是否在UI上。

© www.soinside.com 2019 - 2024. All rights reserved.