2011-10-18 37 views
1

我有一个问题。我有一个asynctask,其中我连接到一个Web服务,将数据放入数据库。这没关系,它的工作原理。但我有一个问题,我想单击REFRESH(多数民众赞成时,我做的Web服务)后,进度条..Android - 用webservice缓慢ProgressDialog AsyncTask

当我刷新,需要2秒,而我的屏幕冻结,然后开始进度条稍稍消失,但是在进度条开始之前完成。

这里是的AsyncTask的代码

private class tareaActualizar extends AsyncTask<Void, Void, Boolean> { 
     private static final String DEBUG_TAG = "actualizo"; 
     private ProgressDialog pd = new ProgressDialog(ShamanOperativoActivity.this); 

     @Override 
     protected void onCancelled() { 
      Log.i(DEBUG_TAG, "onCancelled"); 

       pd.dismiss(); 

     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      Log.i(DEBUG_TAG, "onPostExecute"); 

       pd.dismiss(); 

     } 

     @Override 
     protected void onPreExecute() { 

      pd.setMessage("Actualizando..."); 
      pd.show(); 


     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 



     } 
     @Override 
     protected Boolean doInBackground(Void... params) { 


      webService(); 

      tv2 = resultado.toString();   //Obtengo el string resultado del WebService en tv2 

      //Obtengo la hora actual 

      insertoEnBD(); 
      // Inserto en base de datos (Si es que pase por el Web Service) 
      Boolean res = true; 
      return res; 



     } 







    } 

Webservice的是Web服务的连接如的方法,而“InsertoBD”是,当我把数据导入数据库..感谢

+0

我看不出有什么错在你的AsyncTask实现,如何你是否知道你的任务在进度条开始之前完成。根据你的描述,除了2秒的冻结,我会说这是我的期望从你的AsyncTask:进度条显示 - >任务快速完成 - >进度条被驳回。 – yorkw

+0

因为我的UI是刷新和更改数据..后,我看到进度条开始.. –

+0

我会建议注释掉doInBackground()中的所有代码,并简单地做一个Log.i(标签,“做某事”)看看UI刷新是否实际来自你的doInBackground()。通过这样做,您还可以检查Logcat以查看是否在onPreExecute()之后调用doInBackground()。我想你的代码中可能还有其他地方在主线程中执行同样繁重的任务,这解释了单击刷新按钮时2秒钟冻结。 – yorkw

回答

0

试着改变方式您实例化ProgressDialog这样:

 @Override 
    protected void onPreExecute() { 
     pd = ProgressDialog.show(context, "", "My text is here..."); 
    } 

请注意,如果你只使用模拟器进行测试,ProgressDialogs可以在出现慢/消失意味着你的如果您在设备上测试,问题可能不存在。

+0

我在设备上测试它,我有同样的问题.. –

0

我建议你在你的环境Activity中声明ProgressDialog。然后你可以试试这个代码。它为我的作品:

其中的AsyncTask声明

环境类:

private ProgressDialog dialog; 

... 

private class tareaActualizar extends AsyncTask<Void, Void, Boolean> { 
     private static final String DEBUG_TAG = "actualizo"; 

... 
@Override 
     protected void onPreExecute() { 

        pd = new ProgressDialog(ShamanOperativoActivity.this); 

      pd = ProgressDialog.show(getParent().getParent(), "Wait", 
        "Loading..."); 


     } 
... 
+0

我不能理解这一点,我在我的课堂上声明对话,然后我在我的asynctask类中使用pd?我试过这段代码,它显示了一个由nullpointer异常关闭的强制.. –

+0

你必须将两个类放在同一个.java文件中。 – atzu

0

尝试这些一个.....

private class tareaActualizar extends AsyncTask<Void, Void, Void> 

{ 

private static final String DEBUG_TAG = "actualizo"; 

     private ProgressDialog pd = new ProgressDialog(ShamanOperativoActivity.this); 

     protected void onPreExecute() { 
       pd.setMessage("Actualizando..."); 
      pd.show(); 

     } 

     protected Void doInBackground(Void... para) { 

       webService(); 

      tv2 = resultado.toString();   //Obtengo el string resultado del WebService en tv2 

      //Obtengo la hora actual 

      insertoEnBD(); 
      // Inserto en base de datos (Si es que pase por el Web Service) 
      Boolean res = true; 
      return res; 


     } 

     protected void onPostExecute(Void params) { 

       pd.dismiss(); 

     } 
    }