1

У меня есть класс non-activity MenuHandler для обработки событий, связанных с меню, Я пытаюсь отобразить сообщение разработчиков в диалоговом окне предупреждения, это сообщение извлекает из базы данных реального времени firebase.Нет ошибок, но предупреждение не отображается

Все нормально, но диалоговое окно предупреждения не отображается, я пытаюсь отладчика проверить там какие-либо ошибки в базе данных, но я получил правильное значение из базы данных. Нет Ошибка получения значения из базы данных.

Когда я выбираю меню из MainActivity, developerMessage тосты показывают, что ничего не произошло.

Прошел context до MenuHandler класс надлежащим образом. Могу ли я показать Alerdialog в контексте? или мне нужно написать код только в MainActivity (т. Е. Только класс активности).

Код:

public void developersMessage() 
    { 

     if (isInternetOn()) { 

      Toast.makeText(mContext,"Loading message please wait",Toast.LENGTH_SHORT).show(); 

      DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 

      mDatabase.child("version_1_0").child("dev").addListenerForSingleValueEvent(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

         try { 

          final AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 
          builder.setTitle(mContext.getString(R.string.welcome_msg)); 
          builder.setMessage(dataSnapshot.child("dev_msg").getValue(String.class)); 
          builder.setPositiveButton("ok",null); 

          builder.create().show(); 
         } 
         catch (Exception e) 
         { 
          e.printStackTrace(); 
         } 
        } 


       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

     } 
     else 
     { 
      Toast.makeText(mContext,"please turn on internet ",Toast.LENGTH_SHORT).show(); 
     } 
    } 
+0

Попробуйте создать экземпляр 'AlertDialog' вместо' builder.create() шоу() ', как это:. ' AlertDialog диалог = builder.create() '' dialog.show(); ' –

+0

ничего не изменилось. результат такой же –

+0

на уровне 'try ... catch', вы можете получить отладочные журналы или тосты? Потому что если вы в этом случае, то проблема заключается в диалоговом окне предупреждения, если вы не можете переместить отладку уровня до 'listener' и т. Д. –

ответ

0

я получил ответ, Там ничего плохого в коде, но ошибка заключается в том, как я отправьте контекст с mainactivity

здесь я ошибочно инициализирую Menuhandler класс

public boolean onOptionsItemSelected(MenuItem item) { 

final MenuHandler mMenuHandler = new MenuHandler(this.getApplicationContext());//bug lies here 

если мы демонстрируем alertdialog тогда нам нужно так, чтобы передать контекст так наш alertdialog дисплей правильно

public boolean onOptionsItemSelected(MenuItem item) { 
     final MenuHandler mMenuHandler = new MenuHandler(MainActivity.this);//this is right way to pass context 

надеюсь, что это полезно для кого-то в будущем.

0

Создайте свой AlertDialog из

mDatabase.child("version_1_0").child("dev").addListenerForSingleValueEvent(...); 

Метод addListenerForSingleValueEvent(...) работает на другом фоне потока, так что интерфейс не может быть обновлена ​​внутри от UI потока. Таким образом, создание вашего AlertDailog из метода addListenerForSingleValueEvent(...) должно решить вашу проблему.

0

Вы должны использовать контекст активности для создания AlertDialog.

И пожалуйста отладить, чтобы убедиться onDataChange() называется

Также попробуйте runOnUiThread: https://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

yourActivity.runOnUiThread(new Runnable() { public void run() {... code to create & show dialog ...} })

+0

onDatachange работает. Мой класс MainActivity и MenuHandeler отличается, –

+0

Итак, попробуйте передать ссылку на работу с MenuHandler. Используйте его для runOnUiThread и создания диалога – Akivamu

Смежные вопросы