我没有接受过正规的编码教育,所以如果我做的事情被认为是糟糕的编码,请告诉我
我正在为我正在制作的火车时刻表应用程序使用底部导航 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/