【发布时间】:2023-02-07 04:20:50
【问题描述】:
我最近用处理程序和 newSingleThreadExecutors 替换了我的应用程序中所有已弃用的 AsyncTask 代码。从远程服务器检索响应数据后,我在代码的 handler.post 部分更新了 UI。
我个人从来没有能够重现任何问题,但在某些真实条件下的某些设备(主要是 oppo、redmi、vivo 等)上,getView() 返回 null 并且我的权宜之计尝试重新膨胀视图失败。崩溃次数增加了很多:
异常 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”
我的代码的粗略概述:
public class ResultFragment extends Fragment {
.....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.result, container, false);
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
Bundle bundle = this.getArguments();
assert bundle != null;
String query_url = bundle.getString("query_url");
send_request(query_url);
}
void send_request(String... urls) {
Handler handler = new Handler(Looper.getMainLooper());
Executors.newSingleThreadExecutor().execute(() -> {
.....
handler.post(() -> {
context = getContext();
final TextView mTextView;
final WebView mWebView;
if (getView() != null) {
mTextView = getView().findViewById(R.id.count);
mWebView = getView().findViewById(R.id.result);
} else {
View view = LayoutInflater.from(context).inflate(R.layout.result, null); <-- crash
mTextView = view.findViewById(R.id.count);
mWebView = view.findViewById(R.id.result);
}
我从生命周期文档中了解到,我应该能够使用此代码获取视图。而且我确实明白,尝试像这样重新膨胀代码是一个危险的提议(可能会发生崩溃!)。但是当 getView() 返回 null 时我该怎么做呢?
正如我所说,我从未能够重现这些崩溃。所以我愿意尝试任何可能有效的方法。
对于一般信息,我的目标是 sdk 版本 33。
【问题讨论】:
标签: android handler layout-inflater getview