Как решить - Попытка вызвать виртуальный метод 'void android.app.ProgressDialog.dismiss()' для нулевой ссылки на объект

Я новичок и не знаю большую часть Парадигмы Android, пожалуйста, помогите!!

Извиняюсь!! если кто-нибудь найдет этот вопрос дубликатом.

Я столкнулся с проблемой закрытия ProgressDialog по нулевой ссылке во время загрузки Spinner.

Это происходит один раз при отключении и повторном подключении к Интернету, но до отключения все работает нормально, т.е. загрузка прекращается, когда что-то есть в Spinner

Я настроил метод dismiss() на выполнение, когда в операторе Spinner с помощью if () есть что-то, но я не знаю, как он выполняется, прежде чем он найдет что-то в Spinner, я даже установил Regex, чтобы диалоговое окно отклоняется, когда он соответствует Regex, и даже после этого диалоговое окно все равно закрывается.

Here's my code

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spingroup = (Spinner) findViewById(R.id.spingrp);

        if (Connection.isConn(this)) {
            Toast.makeText(this, "No internet connection detected, please check your internet connection", Toast.LENGTH_SHORT).show();
            AlertDialog alertDog = new AlertDialog.Builder(this).create();

            alertDog.setTitle("No Internet!!");
            alertDog.setMessage("Please connect to internet & try again");
            alertDog.setIcon(R.drawable.no_internet);
            alertDog.setCanceledOnTouchOutside(false);
            alertDog.setButton("Exit", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alertDog.show();
        }

        if (!Connection.isConn(this)){

            progress = ProgressDialog.show(MainActivity.this, "Loading Group","Please wait!!", true);
            progress.setCancelable(true);
            progress.setIcon(R.drawable.list_icon);
        }
//Yes this if () statement gets called before the null reference error


        dbrefspingrp = FirebaseDatabase.getInstance().getReference();
        dbrefspingrp.child("2018-19").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                final List<String> listgrp = new ArrayList<String>();
                listgrp.add("--Select Group--");

                for (DataSnapshot grpsnap: dataSnapshot.getChildren()){
                    String group = grpsnap.getKey();
                    listgrp.add(group);
                }
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,listgrp );
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                adapter.notifyDataSetChanged();
                spingroup.setAdapter(adapter);

                String test = listgrp.get(listgrp.size()-1);

                boolean reg = Pattern.matches("(?i)group no [0-9]{2}", test);

                if (reg == true) {
                    progress.dismiss();
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

My Attempts

1-

if (spingroup.getSelectedItem().toString().equals("--Select Group--")) {
                        progress.dismiss();
                    }

2-

if (!spingroup.getSelectedItem().toString().equals(null)) {
                        progress.dismiss();
                    }

3-

if (spingroup.getSelectedItem().toString().equals("--Select Group--") && spingroup.getSelectedItem.toString != (null) {
                        progress.dismiss();
                    }
2
0
3 056
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что ProgressDialog прогресс равен null. Вероятно, потому что эта часть кода никогда не вызывается (или, по крайней мере, до того, как вы попытаетесь получить доступ к ProgressDialog):

if (!Connection.isConn(this)){

    progress = ProgressDialog.show(MainActivity.this, "Loading Group","Please wait!!", true);
    progress.setCancelable(true);
    progress.setIcon(R.drawable.list_icon);
}

Вы можете избежать исключения, проверив свой ProgressDialog перед доступом к нему, например:

if (progress != null && progress.isShowing()) {
   progress.dismiss();
}

Я ценю ваш вклад, но вызывается ProgressDialog, потому что перед ошибкой происходит загрузка с заголовком Loading Group и сообщением Please Wait.

Cybertronian 02.05.2019 21:27

Можете ли вы опубликовать свою трассировку стека? Может быть, я смогу понять, в чем проблема :)

Rene Ferrari 02.05.2019 21:38

java.lang.NullPinterException: попытка вызвать виртуальный метод «void android.app.ProgressDialog.dismiss()» для нулевой ссылки в com.example.myapp.MainActivity$3.onDataChange(MainActivity.j‌​ava:136)

Cybertronian 02.05.2019 21:57

Спасибо! Вы пробовали мое предложение с progress != null && progress.isShowing()? Если это не работает - есть ли какая-либо другая часть в MainACTivity, где используется progressDialog?

Rene Ferrari 02.05.2019 22:07

Спасибо, сэр! заработало, при повторном подключении интернета ошибок не было. но поскольку я оставался в приложении до повторного подключения к Интернету, загрузки не было, и счетчик был заполнен данными, но мне нужна загрузка, пока данные не будут загружены. В противном случае он показывает загрузку.

Cybertronian 02.05.2019 22:22

Здорово! Я счастлив, что это помогло! :)

Rene Ferrari 02.05.2019 22:23

Извините за беспокойство, но я оставался в приложении до переподключения интернета, поэтому при подключении интернета загрузки не было и Spinner заполнялся данными

Cybertronian 02.05.2019 22:27

Итак, вы ожидали, что progressDialog покажет тогда? Ну, проблема в том, что вы только проверяете onCreate, должны ли вы показывать свой progressDialog или нет. Вам придется прослушивать изменения подключения, а затем соответствующим образом обновлять свой пользовательский интерфейс. Таким образом, лучшим способом будет зарегистрировать слушателя, и когда ваше интернет-соединение изменится, вы обновите свой пользовательский интерфейс по мере необходимости. Вы можете использовать предоставленное решение здесь, которое позволяет прослушивать изменения в подключении.

Rene Ferrari 02.05.2019 22:35

Поскольку вы новичок (как вы сами сказали), я не могу оценить, как много вы знаете, но если вы не знаете, как работают слушатели, возможно, это вам поможет.

Rene Ferrari 02.05.2019 22:37

Другие вопросы по теме