Оповещение Android AsyncTask Dialog - PullRequest
       31

Оповещение Android AsyncTask Dialog

0 голосов
/ 10 ноября 2011

У меня есть заставка, которая проверяет URL-адрес, если есть какой-либо новый контент на сервере. Если показать, я хочу показать AlertDialog пользователю приложения, чтобы в зависимости от действий пользователя, т.е. если ДА, загрузить новое содержимое с сервера и передать его в базу данных, если НЕТ, загрузить содержимое для приложения с сервера.

Однако я не могу использовать диалоговое окно с предупреждением внутри AsyncTask Мой фрагмент кода выглядит так:

protected String doInBackground(String... mode){
  /* I AM QUERY MY DATABASE FOR THE PREVIOUS CONTENT(SAY CONTENT 1, CONTENT 2);
  * then i start my connection to the server which has an xml file with the content
  * info (say content 3), at this stage .
  * i Check certain condition here,
  * say if result ==0 then i wish to display an alertdialog.
  * I used an alert dialog and i get some error. Stating use Looper or Handler.

  * Can anyone help me with this?
  */  
}

Отредактировано

Так что в

doInBackGround(String... mode){
  if(result==0){
    // how do i implement this alert show that if the dialog appears and on clicking Yes i wish to exectute the URL handling part below        

    AlertDialog.Builder alert = new AlertDialog.Builder(context);
    alert.setTitle("Updates Found");
    alert.setMessage( "New Updates for has been found.\n Would you like to download ?\n"
              + "Whats the update: Checking "+pld.result.get(i).get( "issue" ));
    alert.setIcon(android.R.drawable.ic_dialog_info);                              
    alert.setPositiveButton(android.R.string.yes,
      new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
          try { 
            URL url = new URL(pld.result.get(i).get("link"));
            ManageZipFile.getArchive(url,pld.result.get(i).get("issue"), file); 
          } 
          catch (Exception ex) { 
            Log.d(TAG, "Exception from URL"+ ex.getMessage()); 
          }

          progressState += updateProgressBar(20);
          pld.saveCoverData(pld.result.get(i).get("issue"));
          try { 
            pldContent = new PullLoadData(getString(R.string.files_path) 
                                          + pld.result.get(i).get("issue") 
                                          + "/contents.xml",context); 
            pldContent.getNewsItems();
            progressState += updateProgressBar(20); 
          } 
          catch(XmlPullParserException e) { 
            Log.e(TAG, "GetNEWSITEM "+ e.getMessage()); 
          } 
          catch (IOException e) { 
            Log.e(TAG, "XML FIle not found" + e.getMessage()); 
          } 
        } 
     });

     alert.setNegativeButton(android.R.string.no, 
       new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int arg1) { 
           dialog.dismiss();
       }
     }); 

     AlertDialog showAlert = alert.create();
     showAlert.show();
   }
 }

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Это связано с тем, что метод doInBackground выполняется в потоке, не являющемся пользовательским интерфейсом, и AlertDialog должен отображаться в потоке пользовательского интерфейса.

Чтобы решить вашу проблему, переместите код для AlertDialog в метод onProgressUpdate в AsyncTask, затем, когда вы хотите отобразить вызов Dialog publishProgress() из doInBackground

protected String doInBackground( String... mode ) {
  if( something )
    //Conditions for showing a Dialog has been met
}

protected void onProgressUpdate( Void... params ) {
  //Show your dialog.
}

Если вам нужно передать какую-либо переменную / данные в диалог, вы можете передать тип данных, который вы объявили в extends AsyncTask<Params, Progress, Result> - где Progress - это тип параметра, который вы можете передать через publishProgress( myVariable ) - способ.

3 голосов
/ 10 ноября 2011

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

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

AsyncTask содержат методыкак onPreExecute() onPostExecute() onProgressUpdate() ,doInBackground () и т. д. вы можете получить доступ к потоку пользовательского интерфейса из onPreExecute() onPostExecute() onProgressUpdate(). Операция, требующая более длительного времени обработки, должна быть выполнена в doinbackground().

Я не могу понять требования к функциональности из вашего вопроса, но если вы хотитечтобы отобразить Alert Dialog до операции извлечения данных, показать ее из onPreExecute () или если вы хотите отобразить после извлечения данных сделать это из onPostExecute().

...