Android AsyncTask对话警报

时间:2011-11-10 08:01:29

标签: android exception android-asynctask looper

我有一个启动画面,如果服务器上有任何新内容,则会检查URL。如果show我希望向app用户显示一个AlertDialog,以便取决于用户的操作,即如果YES从服务器下载新内容并将其送到数据库,否则如果NO从服务器加载应用程序的内容。 / p>

但是我无法在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 个答案:

答案 0 :(得分:5)

这是因为方法doInBackground在非UI线程上运行,并且需要在UI线程上显示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 ) - 。方法

答案 1 :(得分:3)

UI线程意味着它与您的UI直接关联。您无法执行网络数据提取,磁盘访问等等操作,这些操作需要在UI线程中处理大量处理时间。它们应该以单独的方式完成。

AsyncTask有助于在单独的线程中执行theese操作,否则可能会导致臭名昭着的ANR错误。(应用程序没有响应)。

AsyncTask包含onPreExecute() onPostExecute() onProgressUpdate() ,doInBackground ()等方法,您可以从onPreExecute() onPostExecute() onProgressUpdate()访问UI线程。需要更长处理时间的操作应在doinbackground().

中执行

我无法理解您的问题的功能需求,但如果您想在数据提取操作之前显示Alert Dialog 从onPreExecute()显示它 或者如果您希望在数据提取后显示 从onPostExecute()执行此操作。