2012-01-04 2 views
0

am Использование асинхронной задачи для удара URL-адреса веб-службы и получения результата от сервера, но некоторое время в методе onPreExecute(), если возникает исключение синтаксического анализа, я обрабатываю его на catch (метод), теперь я хочу, чтобы остановить обработку следующего означает выполнение не идти на OnpostExecute() метод, так как остановить процесс выполнения для перехода его в OnPostExecute() мой код нижеостановить, чтобы продолжить onPostExecute(), если возникает исключение синтаксического анализа onpreexecute()

@Override 
    protected void onPreExecute() { 
      dialog = new ProgressDialog(MainMenu.this); 
      dialog.setMessage("Processing..."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 
      dialog.show(); 
    } 
    @Override 
    protected void onPostExecute(final Boolean success) { 

      if (dialog.isShowing()) 
      { 
      dialog.dismiss(); 
      } 
      Intent i = new Intent(MainMenu.this, filterpagetabs.class); 
       startActivity(i); 



    } 
     @Override 
    protected Boolean doInBackground(final String... args) { 
     try{  
      try { 
       SAXParserFactory spf = SAXParserFactory.newInstance(); 
       SAXParser sp = spf.newSAXParser(); 
       XMLReader xr = sp.getXMLReader(); 
       URL sourceUrl = new URL(
         "http://www.mobi/iphonejh/output.php?estado=1"); 
       MyXMLHandler myXMLHandler = new MyXMLHandler(); 
       xr.setContentHandler(myXMLHandler); 
       xr.parse(new InputSource(sourceUrl.openStream())); 


      } catch (Exception e) { 
       System.out.println("XML Pasing Excpetion = " + e); 



      } 

}

ответ

1

Поместите синтаксический анализSuccessful булевой переменной вверху со значением true. В улове исключения синтаксического анализа задано значение false. В postExecute используйте оператор if для проверки успешного выполнения синтаксического анализа и установки строк onPostExecute в этом операторе if.

Как это:.

private boolean parsingSuccessful = true; 

@Override 
protected void onPreExecute() { 
     dialog = new ProgressDialog(MainMenu.this); 
     dialog.setMessage("Processing..."); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
} 
@Override 
protected void onPostExecute(final Boolean success) { 
     if (parsingSuccessful == true){ 
      if (dialog.isShowing()){ 
       dialog.dismiss(); 
      } 
      Intent i = new Intent(MainMenu.this, filterpagetabs.class); 
      startActivity(i); 
    } 
} 
    @Override 
protected Boolean doInBackground(final String... args) { 
     try { 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      URL sourceUrl = new URL(
        "http://www.mobi/iphonejh/output.php?estado=1"); 
      MyXMLHandler myXMLHandler = new MyXMLHandler(); 
      xr.setContentHandler(myXMLHandler); 
      xr.parse(new InputSource(sourceUrl.openStream())); 

     } catch (Exception e) { 
      System.out.println("XML Pasing Excpetion = " + e); 
      parsingSuccessful = false; 

}

+0

спасибо +1 за хороший ответ – shyam

+0

ну, это работает ... но ... вы можете сделать это без парсингаSuccessful var ... doInBackground возвращает Boolean, который будет передан onPostExecute (...) как «окончательный булевский успех» ... – Selvin

3

http://developer.android.com/reference/android/os/AsyncTask.html

«Задача может быть отменена в любой момент, вызвав отмены (булево) Вызов этого метода будет вызывать последующие вызовы isCancelled (), чтобы вернуть true. После вызова этого метода функция onCancelled (Object) вместо onPostExecute (Object) будет вызываться после возвращения doInBackground (Object []). Чтобы гарантировать, что задача будет отменена как можно быстрее, вы всегда должны проверять Ретур n значение isCancelled() периодически из doInBackground (Object []), если это возможно (внутри цикла, например.) "

Хотя, поскольку основная часть вашей работы уже выполнена, т.е. сетевой ввод-вывод, это может быть лучше просто вернуть успех boolean и проверить, что onPostExecute

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