安卓:显示解析的进度指标下载XML [英] Android: Show progress indicator of parse while downloading a 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屋!