gpt4 book ai didi

Android 从 AsyncTask 更新 UI 线程的最佳方式

转载 作者:行者123 更新时间:2023-11-29 17:31:55 24 4
gpt4 key购买 nike

我今天发布了一个应用程序,我收到了一些崩溃报告,表明以下内容:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference

我有 Activity 和几个 Fragments。这个错误发生在我有一个 AsyncTask 的 fragment 中:

private ProgressDialog dialog;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_dial, container, false);
dialog = new ProgressDialog(getActivity());
new CountryCodeTask().execute();
return view;
}

private class CountryCodeTask extends AsyncTask<Void, Void, ArrayList<String>>
{
@Override
protected void onPreExecute()
{
if (!dialog.isShowing()) {
dialog.show();
}
}

@Override
protected void onPostExecute(ArrayList<String> result)
{
if (dialog.isShowing()) {
dialog.dismiss();
}

if (result != null) {
Spinner countryCodeSpinner = (Spinner) getActivity().findViewById(R.id.country_code_spinner);
countryCodeSpinner.setAdapter(new CountryCodeAdapter(getActivity(), result));
countryCodeSpinner.setSelection(countryCodeSpinnerValue);
countryCodes = result;
}
}

@Override
protected ArrayList<String> doInBackground(Void... params)
{
return MainActivity.apiService.getCountryCodes();
}
}

我猜这不是从 ASyncTask 更新 UI 线程的最佳方式。当我使用后退/主页按钮然后重新启动应用程序时(但并非始终如此),会发生此错误。我在这里做错了什么?

错误发生在这一行:Spinner countryCodeSpinner = (Spinner) getActivity().findViewById(R.id.country_code_spinner);

最佳答案

您实际上并没有做错什么 - 可以预料的是,当您通过 back/home 离开 Activity 时,AsyncTask 将不再具有对该 Activity 的引用。我会修改您的代码来处理这种常见情况:

@Override
protected void onPostExecute(ArrayList<String> result)
{
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
Activity activity = getActivity();
if (activity != null) {
if (result != null) {
Spinner countryCodeSpinner = (Spinner) activity.findViewById(R.id.country_code_spinner);
countryCodeSpinner.setAdapter(new CountryCodeAdapter(activity, result));
countryCodeSpinner.setSelection(countryCodeSpinnerValue);
countryCodes = result;
} else {
cancelTaskAndShowDialog();
}
}
}

关于Android 从 AsyncTask 更新 UI 线程的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com