java - Fragment 中 AsyncTask 中的 ProgressDialog 崩溃

标签 java asynchronous android-asynctask fragment progressdialog

我在 Activity 中有一个带有 AsyncTaskFragment。但当我运行搜索时出现此异常:

Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference.

这与片段不知道 Activity 是否正在运行有关,但我不知道如何修复它。 请帮忙。 这是代码:

class Send_API extends AsyncTask<String, Void, String> {

        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            if (movieList != null){
                movieList.clear();
                adapter.notifyDataSetChanged();
            }

            dialog = new ProgressDialog(getActivity());
            dialog.setMessage("Searching...");
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            String queryString = null;
            try {
                queryString = "" +
                        "s=" + URLEncoder.encode(txt, "utf-8");
            } catch (UnsupportedEncodingException e) {
            }
            return HttpHandler.get(params[0], queryString);
        }


        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            dialog.dismiss();
            if (result == null) {
                Toast.makeText(getActivity(), "error getting results...", Toast.LENGTH_LONG).show();

            } else {

                try {
                    JSONObject json = new JSONObject(result);

                    JSONArray searchArray = json.getJSONArray("Search");

                    for (int i = 0; i < searchArray.length(); i++) {
                        JSONObject searchObject = searchArray.getJSONObject(i);
                        String title = searchObject.getString("Title");
                        String type = searchObject.getString("Type");
                        String year = searchObject.getString("Year");
                        String imdbID = searchObject.getString("imdbID");
                        String poster_url = searchObject.getString("Poster");
                        movieList.add(new Movie(title, type, year, imdbID, poster_url));

                        Log.e(TAG, "MovieList is " + movieList);


                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getActivity(), "error parsing results...", Toast.LENGTH_LONG).show();
                }

                adapter.notifyDataSetChanged();

            }
        }

    }

最佳答案

  dialog = new ProgressDialog(getActivity());
当您初始化 Fragment 时,

getActivity() 将返回 null。您必须等到片段生命周期中的 onAttach() 才能返回非 null。

这就是 NPE 的原因。

总的来说,片段中没有非默认构造函数。仅在 onCreateView() 中设置片段 View 。

关于java - Fragment 中 AsyncTask 中的 ProgressDialog 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33365401/

相关文章:

android - 使用 IMEI 作为 JSON 服务的参数

Android ProgressDialog 返回 null

android - onPostExecute 未在 AsyncTask 中调用(处理程序运行时异常)

java - 改变 JTable TableHeaders 背后的背景

java - 我应该使用 javac -O 选项进行优化吗?

java - 非静态日志能说得过去吗?

java - 为什么在 Spring MVC 服务中调用一个简单方法每次都比静态方法慢?

python - 如何对协程进行限速,限速后重新调用协程?

Javascript通过引用访问成员变量

c# - 不使用 Task.Result 的异步/等待死锁