OKHttp在切换碎片时崩溃



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

我正在为我正在制作的火车时刻表应用程序使用底部导航视图。其中一个选项是附近的功能-当在底部导航抽屉上点击附近时,NearbyFragment就会启动,我的服务器会自动通过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);

我还在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更改为另一个片段,我仍然会遇到与具有NullPointerExceptions的onFailure方法相关的崩溃,并且找不到视图(如snackbar(,所以我将onFailure封装在try/catch中,以捕获所有异常并忽略它们。这感觉像是一次黑客攻击,但当通过底部导航从NearbyFragment切换到另一个片段时,我的应用程序不再像预期的那样崩溃/运行。

@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块?

了解UI上是活动还是片段。

对于"活动",您可以调用isFinishing()对于Fragment调用isAttached()

即在节目加载程序、小吃店或任何小部件包装if(…({}之前

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

最新更新