2012-04-10 16 views
0

ダウンロードXMLを解析中に進捗インジケータバーを表示する必要があります。Android:XMLをダウンロード中に解析の進行状況を表示

私はそれを最初にダウンロードして解析しましたが、両方の動作を同時に行うことはできませんでした。

これはこれを行うためのコードの一部ですが、pogressインジケータの表示方法がわかりません。

public class WS_Sincronizo extends AsyncTask<Void,Integer,List<Alertas>>{ 


private Context conte; 
// Variable para controlar ventana de progreso 
private Sincronizacion actividad; 
private Alertas user; 
private long totalSize; 
private WaitForCancelTask wft; 
private HttpPost httpPost; 
private HttpClient httpClient; 
private HttpContext localContext; 
private List<Alertas> resultado; 
private BaseDatosHelper miBBDDHelper; 
private SQLiteDatabase db; 
private SincronizarXmlHelper manejadorXML; 
private String fecha_bd; 
private HttpEntity resEntity; 

public static double fileSize; 
private double downloaded; // number of bytes downloaded 


public WS_Sincronizo (Context conte,Object actividad, String fecha){ 
    this.conte=conte; 
    this.actividad=(Sincronizacion) actividad; 
    this.fecha_bd=fecha; 
    fileSize = 0; 
    downloaded = 0; 

} 


@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    resultado=null; 
    //TimeOut si exece el tiempo límite 
    wft=new WaitForCancelTask(this,conte,Utiles.TimeOutWebServerSincro); 
} 


@Override 
protected void onProgressUpdate(Integer... progress) { 
// TODO Auto-generated method stub 
    actividad.progreso((int) (progress[0])); 

    if (progress[0].intValue()==100){ 
    /*** CANCELO TIMEOUT ***/ 
    wft.FinishWaitForCancelTask(); 
    } 

} 


@Override 
protected void onPostExecute(List<Alertas> rta) { 
    super.onPostExecute(rta); 
    // Envío mensaje vacio al manejador para indicar que ya terminó. 

    actividad.FinSincronizacion(rta); 



} 


@Override 
protected void onCancelled() { 
    //Si había empezado una transacción la cierro 
    try{ 
    db.releaseReference(); 
    }catch (Exception e) { 
     // TODO: handle exception 

    } 


    httpPost=null; 
    httpClient.getConnectionManager().shutdown(); 

    this.onPostExecute(null); 

} 

@Override 
public List<Alertas> doInBackground(Void... params) { 

     httpClient = new DefaultHttpClient(); 
     localContext = new BasicHttpContext(); 
     httpPost = new HttpPost(Utiles.UrlWebService + "GetSincro"); 


     try { 

     String version = conte.getPackageManager().getPackageInfo(conte.getPackageName(), 0).versionName; 

     multipartContent.addPart("fecha",new StringBody(fecha_bd)); 

     multipartContent.addPart("version",new StringBody(version)); 

     multipartContent.addPart("sistema",new StringBody(Utiles.SISTEMA)); 



    httpPost.setEntity(multipartContent); 

    HttpResponse httpresponse = httpClient.execute(httpPost,localContext); 

    if(httpresponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK){ 
     //Cancelo TimeOut porque resp es ok; 


     resEntity = httpresponse.getEntity(); 


      if (resEntity != null) { 

      fileSize = resEntity.getContentLength(); 

      //Log.d("SIZE:",MemoryStatus.formatSize((long)fileSize)); 
      Log.d("SIZE:",String.valueOf(fileSize)); 

      //Log.i("RESPONSE",EntityUtils.toString(resEntity)); 
       SAXParserFactory fabrica = SAXParserFactory.newInstance(); 
       SAXParser parser = fabrica.newSAXParser(); 
       XMLReader lector = parser.getXMLReader(); 






       try{ 
        miBBDDHelper = new BaseDatosHelper(conte); 
        db=miBBDDHelper.SincronizarTablas(); 
        manejadorXML = new SincronizarXmlHelper(db); 
        lector.setContentHandler(manejadorXML); 
        lector.parse(new InputSource(resEntity.getContent())); 
        // Obtengo el resultado del XML 
        resultado = manejadorXML.getListas(); 

       }catch (Exception e){ 

       } 

       finally { 
        // TODO: handle exception 
        resEntity.consumeContent(); 
        if (db.inTransaction()) { 
         db.endTransaction(); 
        } 
        db.close(); 
        miBBDDHelper.close(); 

       } 

       if(resultado.isEmpty()) { 
        throw null; 
       } 
       else { 
        return resultado; 
       } 

       // Si dio error la RESPUESTA del SERWEB 

      } else { 

       throw null; 
      } 

      // Si no recibo la cabecera ok ,fuera 
     } else { 

      throw null; 

     }   


    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     // Log.d("Error",e.getMessage()); 
     httpClient.getConnectionManager().shutdown(); 
     return null; 

    } 



} 

答えて

0

私はあなたが試みていることを行うためにAsyncTaskを使用することをお勧めします。 doInBackground()を使用してダウンロードおよび解析()を行い、onProgressUpdate()を使用してprogressdialogを表示できます。ここでは同じことを行うチュートリアルです。

http://www.shubhayu.com/android/witer-asynctask-what-why-how

またはあなたは、Android開発者ブログでAsyncTaskを検索することができます。

編集するには、次を使用して、)

あなたの拡張AsyncTaskでprivate ProgressDialog mProgress = null;を宣言してからProgressパラメータを仮定すると、文字列であるとResultパラメータが

@Override 
protected void onPreExecute() { 
    mProgress = ProgressDialog.show(mContext, progressTitle, mMessage); 
    mProgress.setCancelable(false); 
    super.onPreExecute(); 
} 

@Override 
protected void onProgressUpdate(String... progress) { 
    mProgress.setMessage(progress); 
} 

@Override 
protected void onPostExecute(Boolean result) { 

    if(result){ 
     mProgress.setMessage("Succesfully Downloaded and Parsed!"); 
    }else{ 
     mProgress.setMessage("Failed to download :("); 
    } 
    mProgress.dismiss(); 
    super.onPostExecute(result); 
} 

そして、あなたのdoInBackGround(のbooleanで、次を追加進捗ダイアログを更新する

publishProgress("your update Message"); 
+0

申し訳ありませんが、このコードは私の "doInBackground()"メソッドの中にあります。 – lolaylo21

+0

すごいよ!残りの部分は非常にシンプルになりますが、私は答えを更新します – Shubhayu

+0

私はあなたの要件に応じてそれを変更することができます(%ではなく、文字列ではない)%進捗表示 – lolaylo21

0

試行:

public class SomeActivity extends Activity { 

    private static final int PROGRESS_DIALOG_ID = 0; 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     if (id == PROGRESS_DIALOG_ID) { 
      ProgressDialog dialog = new ProgressDialog(this); 
      dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      dialog.setMessage("Loading..."); 
      dialog.setCancelable(false); 
      return dialog; 
     } 
     return super.onCreateDialog(id); 
    } 

    public void someMethod(){ 
     new SomeTask().execute(); 
    } 

    class SomeTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      showDialog(PROGRESS_DIALOG_ID); 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
     // download and parse 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void aVoid) { 
      dismissDialog(PROGRESS_DIALOG_ID); 
     } 
    } 
} 
関連する問題