我没有接受过正规的编码教育,所以请让我知道我做过的事情是否被认为是不好的编码
我正在为正在制作的火车时刻表应用程序使用底部导航视图。选项之一是“附近”功能-单击底部导航抽屉上的“附近”时,将启动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块的组合)的情况下停止崩溃?
我没有接受过正规的编码培训,所以请让我知道我做过的事情是否被认为是不好的编码,我正在为正在制作的火车时刻表应用程序使用底部导航视图。 ...
要知道活动或片段是否在UI上。