2011-11-10 3 views
0

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

Однако я не в состоянии использовать диалог предупреждения внутри 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(); 
    } 
} 

ответ

3

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

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

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

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

+0

Как это заполнит мое требование в приведенном выше фрагменте кода – Robin

+0

, вы сказали, что вас путают с потоками ..? – drooooooid

+0

Спасибо, я понял, что вы сказали и что я читал? как inDobackGround Я не могу запустить свой AlertDialog. можете ли вы PLS прокрасться в него – Robin

5

Это происходит потому, что метод doInBackground работает с потоком неинтерфейса, а AlertDialog необходимо вытеснить в соответствии с UI-нитью.

Чтобы решить проблему, перенесите код для вашего 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. 
} 

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

+0

Я отредактировал свой вопрос, можете ли вы рассказать об этом. я путаюсь с нитью, вещами – Robin

+0

Можете ли вы помочь мне здесь с моим EDit. onPreExecute() Я создал диалог, но диалог имеет две кнопки ok и отменяет, когда я нажимаю ok, мне нужно делать другие вещи, такие как соединение с URL. – Robin