【问题标题】:Fragment not attached to a context after asynctask异步任务后片段未附加到上下文
【发布时间】:2022-01-12 16:56:38
【问题描述】:

大家好,我在片段中遇到问题,从第二个片段更改为第三个片段后,片段中出现空指针异常:在第一次 onCreateView 上它工作正常,但是当我更改它时,我得到空指针异常。我试过 getContext(),getActivity(),requireContext() 但我总是得到这个异常。谢谢 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.content.Context.getSystemService(java.lang.String)”

 public class GetListaVozila extends AsyncTask<ArrayList<String>, Void, Void> {



        protected void onPreExecute() {
            /****** NOTE: You can call UI Element here. *****/
//            progressDialog = getDialogProgressBar().show();
//            progressDialog.setCancelable(false);

        }


        // Call after onPreExecute method
        protected Void doInBackground(ArrayList<String>... urls) {
            try {
                System.out.println("pozvanooo1");
                URL url = new URL("http://example/app/lista_vozila_novo.php");
                URLConnection conn = url.openConnection();
                HttpURLConnection httpConn = (HttpURLConnection) conn;
                httpConn.setAllowUserInteraction(false);
                httpConn.setInstanceFollowRedirects(true);
                httpConn.setRequestMethod("POST");
                httpConn.setDoInput(true);
                httpConn.setDoOutput(true);
                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("key", key);
                String query = builder.build().getEncodedQuery();
                httpConn.connect();
                OutputStream os = httpConn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();
                InputStream is = httpConn.getInputStream();
                parsedString = convertinputStreamToString(is);
                System.out.println("pozvanooo parsedstring" + parsedString + " - " + key);


            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }



        protected void onPostExecute(Void unused) {

            Gson gson = new Gson();
            Type type = new TypeToken<List<PozicijaVozila>>() {
            }.getType();
            listaVozila = gson.fromJson(parsedString, type);
            values = new ArrayList<String>();
//            ArrayList<PozicijaVozila> array_sort = new ArrayList<PozicijaVozila>(listaVozila);
            for (PozicijaVozila p : listaVozila) {
                values.add(p.getIme());
            }
            it = new ArrayList<PozicijaVozila>(listaVozila);
//            for (int i = 0; i < it.size(); i++) {
//                values.add(it.get(i).getIme());
//            }
I got exception here: adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, values);
            editTextNaziv.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    final Dialog dialog = new Dialog(requireContext());
                    dialog.setContentView(R.layout.vozila_listview);
                    dialog.setTitle(requireContext().getResources().getString(R.string.izaberite_vozilo));
                    listView = (ListView) dialog.findViewById(R.id.list);
                    dialog.show();
                    adapter.notifyDataSetChanged();
                    listView.setAdapter(adapter);
                    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
                    listView.setItemChecked(selectedIndex, false);
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                                int position, long id) {
                            int itemPosition = position;
                            selectedIndex = position;
                            String itemValue = (String) listView
                                    .getItemAtPosition(position);
                            currentSelectedView = view;
                            editTextNaziv.setText(itemValue);
                            // Show Alert
                            view.setBackgroundColor(Color.parseColor("#F8C304"));
                            dialog.cancel();

                        }

                    });


                }
            });
//            progressDialog.dismiss();
//            if (selectedIndex == 0 && values.size() > 0) {
//                editTextNaziv.setText(values.get(0));
//            }
        }
    }

【问题讨论】:

    标签: android


    【解决方案1】:

    AsyncTask 完成其工作时,getActivity() 看起来像 null。它被放置在Fragment 中,所以这意味着这个Fragment 在那个特定时刻(工作结束)没有附加到任何Activity。您应该在 onPauseonDestroyView 等一些生命周期方法中取消您的 AsyncTask 以避免此问题。但请注意,AsyncTask 将没有地方打印其作业的结果(因为Fragment - GUI 端 - 已从屏幕上删除)。如果您想为其他 Fragment 保留该工作,或者只是为了存储以供将来使用 - 开始并将 AsyncTask 保留在 Activity 中(正如您所看到的那样,它无论如何都是通过 getActivity() 方法收紧的,而不是 @ 987654336@)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多