安卓:显示解析的进度指标下载XML [英] Android: Show progress indicator of parse while downloading a XML

查看:138
本文介绍了安卓:显示解析的进度指标下载XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示一个进度指示条在解析XML下载

我做到了下载,然后再解析,但我wan't做两个动作的相似之处。

这是我的code要做到这一点的一部分,但我不知道如何展现pogress指标。

 公共类WS_Sincronizo扩展的AsyncTask<无效,整数,列表< Alertas>> {
民营背景小故事;
//变量对controlar塔纳德普罗格雷索
私人Sincronizacion ACTIVIDAD;
私人Alertas用户;
私人长期总计TOTALSIZE;
私人WaitForCancelTask​​ WFT;
私人HttpPost httpPost;
私人的HttpClient HttpClient的;
私人的HttpContext localContext;
私人列表< Alertas> resultado;
私人BaseDatosHelper miBBDDHelper;
私人SQLiteDatabase分贝;
私人SincronizarXmlHelper manejadorXML;
私人字符串fecha_bd;
私人HttpEntity resEntity;公共静态双重档案大小;
私人双人下载; //下载字节数
公共WS_Sincronizo(上下文小故事,对象ACTIVIDAD,字符串出生日期){
    this.conte =小故事;
    this.actividad =(Sincronizacion)ACTIVIDAD;
    this.fecha_bd =出生日期;
    档案大小= 0;
    下载= 0;}
@覆盖
在preExecute保护无效(){
    super.on preExecute();
    resultado = NULL;
    //超时SI exece时代报LIMITE
    WFT =新WaitForCancelTask​​(这一点,小故事,Utiles.TimeOutWebServerSincro);
}
@覆盖
保护无效onProgressUpdate(整数...进度){
// TODO自动生成方法存根
    actividad.progreso((int)的(进步[0]));  如果(进展[0] .intValue()== 100){
    / *** CANCELO TIMEOUT *** /
    wft.FinishWaitForCancelTask​​();
    }}
@覆盖
保护无效onPostExecute(列表< Alertas> RTA){
    super.onPostExecute(RTA);
    //Envíomensaje vacio人manejador对indicar阙亚terminó。     actividad.FinSincronizacion(RTA);}
@覆盖
保护无效onCancelled(){
    //硅哈博empezado UNAtransacción拉cierro
    尝试{
    db.releaseReference();
    }赶上(例外五){
        // TODO:处理异常    }
    httpPost = NULL;
    。httpClient.getConnectionManager()关机();    this.onPostExecute(NULL);}@覆盖
公开名单< Alertas> doInBackground(虚空...... PARAMS){      HttpClient的=新DefaultHttpClient();
      localContext =新BasicHttpContext();
      httpPost =新HttpPost(Utiles.UrlWebService +GetSincro);
      尝试{        字符串版本= conte.getPackageManager()getPackageInfo(conte.getPackageName(),0).versionName。        multipartContent.addPart(出生日期,新StringBody(fecha_bd));        multipartContent.addPart(版本,新StringBody(版本));        multipartContent.addPart(Sistema的新StringBody(Utiles.SISTEMA));    httpPost.setEntity(multipartContent);    HTT presponse HTT presponse = httpClient.execute(httpPost,localContext);    如果(HTT presponse.getStatusLine()的getStatus code()== HttpURLConnection.HTTP_OK){
        // Cancelo超时porque RESP上课OK;
        resEntity = HTT presponse.getEntity();
            如果(resEntity!= NULL){            档案大小= resEntity.getContentLength();            //Log.d(\"SIZE:\",MemoryStatus.formatSize((long)fileSize));
            Log.d(SIZE:将String.valueOf(档案大小));            //Log.i(\"RESPONSE\",EntityUtils.toString(resEntity));
                Fabrica的SAXParserFactory的= SAXParserFactory.newInstance();
                的SAXParser解析器= fabrica.newSAXParser();
                讲师的XMLReader = parser.getXMLReader();
                尝试{
                    miBBDDHelper =新BaseDatosHelper(孔蒂);
                    DB = miBBDDHelper.SincronizarTablas();
                    manejadorXML =新SincronizarXmlHelper(DB);
                    lector.setContentHandler(manejadorXML);
                    lector.parse(新的InputSource(resEntity.getContent()));
                    // Obtengo EL resultado德尔XML
                    resultado = manejadorXML.getListas();                }赶上(例外五){                }                最后{
                    // TODO:处理异常
                    resEntity.consumeContent();
                    如果(db.inTransaction()){
                        db.endTransaction();
                    }
                    db.close();
                    miBBDDHelper.close();                }                如果(resultado.isEmpty()){
                    扔空;
                }
                其他{
                    返回resultado;
                }                //硅DIO错误LA RESPUESTA德尔SERWEB            }其他{                扔空;
            }            //思无recibo拉cabecera OK,fuera
        }其他{            扔空;        }
    }赶上(例外五){
        // TODO自动生成catch块
       // Log.d(错误,e.getMessage());
        。httpClient.getConnectionManager()关机();
        返回null;    }}


解决方案

我建议你使用的AsyncTask做什么üř尝试。使用doInBackground()下载和解析(),而可以使用onProgressUpdate()来显示progressdialog。这里是一个教程做同样的。

http://www.shubhayu.com/android/witer- AsyncTask的 - 什么 - 为什么 - 怎么

也可以在Android开发者博客搜索AsyncTask的。

修改

声明私人ProgressDialog mProgress = NULL; 你的外扩的AsyncTask,然后添加以下假设进度参数字符串和结果参数是一个布尔

  @覆盖
在preExecute保护无效(){
    mProgress = ProgressDialog.show(mContext,progressTitle,mMessage);
    mProgress.setCancelable(假);
    super.on preExecute();
}@覆盖
保护无效onProgressUpdate(字符串...进度){
    mProgress.setMessage(进度);
}@覆盖
保护无效onPostExecute(布尔结果){    如果(结果){
        mProgress.setMessage(成功与下载并解析!);
    }其他{
        mProgress.setMessage(无法下载:();
    }
    mProgress.dismiss();
    super.onPostExecute(结果);
}

而在你的doInBackGround(),请使用以下更新progressdialog

  publishProgress(你的更新消息);

I need to show a progress indicator bar while parsing a downloading xml.

I did it downloading first, and then parsing, but I wan't to do both action parallels.

This is part of my code to do this, but i don't know how to show the pogress indicator.

   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;

    }



}

解决方案

I suggest you use AsyncTask to do what u r trying. Use the doInBackground() to download and parse() while you can use the onProgressUpdate() to show the progressdialog. here is a tutorial to do the same.

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

or you can search for AsyncTask in the Android Developers blog.

EDIT

Declare private ProgressDialog mProgress = null; in your extended AsyncTask and then add the following assuming Progress parameter is String and Result parameter is boolean

@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);
}

And in your doInBackGround(), use the following to update the progressdialog

publishProgress("your update Message");

这篇关于安卓:显示解析的进度指标下载XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆