2014-12-16 2 views
-1

Я пытаюсь использовать AlertDialog в Android, который уведомит пользователей о том, что они запускаются в автономном режиме после проверки подключения к Интернету.Не удается показать AlertDialog в DoInBackground

Я использовал следующие коды:

protected Void doInBackground(Void... params) { 
      if (this.isOnline()) { 
        new GetJson().execute(); 
      } else { 

     AlertDialog.Builder builder1 = new AlertDialog.Builder(homeFragment); 
     builder1.setMessage("INTERNET CONNECTION NOT AVAILABLE. Now you are viewing the news in Offline Mode."); 
     builder1.setCancelable(true); 

     AlertDialog alert1 = builder1.create(); 
     alert1.show(); 

     try { 
      saveFile = new SaveIntoFile(fileName); 
      jsonStr = saveFile.read(); 
      // Log.d(TAG,"offline data reading from a file"); 
      if (!jsonStr.equals(null)) 
       new GetDatas().execute(); 
      else { 

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

     } 
    } 
    return null; 

} 

Но я получаю сообщение об ошибке при добавлении кодов для AlertDialog. Приложение отлично работает без кодов для AlertDialog. Каковы могут быть ошибки с этим кодом и как я могу исправить его, чтобы хорошо работать?

+0

Почему вы установить его в 'doInBackground()', что это фоновый поток. Операции пользовательского интерфейса там не могут быть выполнены. – Gattsu

+1

сделайте это в onprogressupdate или onpostexecute .. переопределите их и поместите там – Elltz

+0

, где u вызывает Asyanktask, чем check net, здесь или нет и nofify there –

ответ

1

doInBackground() работает на отдельной теме, отличной от основной нити. Вы можете использовать элементы пользовательского интерфейса только в основном потоке. Попробуйте использовать метод runOnUiThread() внутри doInBackground(), чтобы отобразить диалоговое окно.

+0

Причина для downvote? –

0

здесь AlertDialog не работает, вы можете использовать System.out.println («некоторый текст»); , если вы используете оповещение только для целей тестирования. , в противном случае вы должны установить в параметр и какой текст вы хотите разместить в оповещении и просто использовать его в основном потоке.

если у вас есть путаницы, пожалуйста, дайте мне знать.

0

В Android вы можете выполнять операции пользовательского интерфейса только в основном потоке. Таким образом, вы можете показать диалог в методе onPostExecute. Пример:

class anyClassName extends AsyncTask<String,String,String>{ 

    /* uses worker thread */ 
    protected String doInBackground(Void... params) { 
       if (this.isOnline()) { 
         new GetJson().execute(); 
       } else { return null } 
// ... rest of your code 
return "" 
    } 

    /* uses main thread*/ 
    protected void onPostExecute(String result){ 
    if(result == null){ 
    AlertDialog.Builder builder1 = new AlertDialog.Builder(homeFragment); 
      builder1.setMessage("INTERNET CONNECTION NOT AVAILABLE. Now you are viewing the news in Offline Mode."); 
      builder1.setCancelable(true); 

      AlertDialog alert1 = builder1.create(); 
      alert1.show(); 
    } 
    } 
    } 
0
class myAsync extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub   
     if(yourWorkIsDone){ 
      return new String("done"); 
     }else{ 
      return new String("Error message"); 
     } 

     //BUT, if you'd like to check and update user on the error and keep trying then this way 
     // use just one of these two examples 
     if(yourWorkIsDone){ 
      // definately is done but hey it depends on you 
      publishProgress(new String("done")); 
     }else{ 
      // this is when you have error and wona let the user know about and keep trying to hit it right 
      publishProgress(new String("error message")); 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     // here your task is done 
     // you can put myAlertDialogToShow(Context context,String message) depending on ur choice 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
     // here your task is running but you are just informing user, runs on the ui.. 
     // you can put myAlertDialogToShow(Context context,String message) depending on ur choice 
    } 

} 

void myAlertDialogToShow(Context context,String message){ 
    AlertDialog.Builder builder1 = new AlertDialog.Builder(context); 
    builder1.setMessage(message); 
    builder1.setCancelable(true); 
    AlertDialog alert1 = builder1.create(); 
    alert1.show(); 

} 

ayt..check для глупых ошибок и вариантов написания .. им надоело

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