Android-使用webservice AsyncTask的慢速进程对话框

Android-使用webservice AsyncTask的慢速进程对话框,android,progress-bar,android-asynctask,Android,Progress Bar,Android Asynctask,我有个问题。我有一个异步任务,在这个任务中,我连接到一个web服务,将数据放入数据库。没关系,它起作用了。但是我有一个问题,我想在我点击刷新后放置一个进度条(这是我做web服务的时候) 当我刷新时,当我的屏幕冻结时需要2秒钟,然后启动progressbar一点,然后消失,但在progressbar启动之前完成TAK 下面是异步任务的代码 private class tareaActualizar extends AsyncTask<Void, Void, Boolean> {

我有个问题。我有一个异步任务,在这个任务中,我连接到一个web服务,将数据放入数据库。没关系,它起作用了。但是我有一个问题,我想在我点击刷新后放置一个进度条(这是我做web服务的时候)

当我刷新时,当我的屏幕冻结时需要2秒钟,然后启动progressbar一点,然后消失,但在progressbar启动之前完成TAK

下面是异步任务的代码

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;



         }







     }
私有类tareazar扩展异步任务{
私有静态最终字符串DEBUG_TAG=“actualzo”;
private ProgressDialog pd=新建ProgressDialog(ShamanOperativoActivity.this);
@凌驾
受保护的void onCancelled(){
Log.i(DEBUG_标记,“onCancelled”);
pd.解散();
}
@凌驾
受保护的void onPostExecute(布尔结果){
Log.i(DEBUG_标记,“onPostExecute”);
pd.解散();
}
@凌驾
受保护的void onPreExecute(){
pd.setMessage(“现实赞多…”);
pd.show();
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
@凌驾
受保护的布尔doInBackground(Void…params){
webService();
tv2=resultado.toString();//Obtengo el string resultado del WebService en tv2
//奥本戈拉霍拉酒店
insertoEnBD();
//数据基础插件(网络服务)
布尔res=真;
返回res;
}
}

Webservice是连接Webservice的方法,“InsertoBD”是我将数据放入数据库的时候。。谢谢

尝试将ProgressDialog的实例化方式更改为:

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

请注意,如果您仅使用emulator进行测试,ProgressDialog的出现/消失可能会很慢,这意味着如果您在设备上进行测试,问题可能不存在。

我建议您在环境活动中声明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...");


         }
...
私有进程对话框;
...
私有类tareazar扩展异步任务{
私有静态最终字符串DEBUG_TAG=“actualzo”;
...
@凌驾
受保护的void onPreExecute(){
pd=新进度对话框(ShamanOperativoActivity.this);
pd=ProgressDialog.show(getParent().getParent(),“等待”,
“装载…”);
}
...
试试这些

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();

        }
    }
私有类tareazar扩展异步任务
{
私有静态最终字符串DEBUG_TAG=“actualzo”;
private ProgressDialog pd=新建ProgressDialog(ShamanOperativoActivity.this);
受保护的void onPreExecute(){
pd.setMessage(“现实赞多…”);
pd.show();
}
受保护的无效doInBackground(无效…段落){
webService();
tv2=resultado.toString();//Obtengo el string resultado del WebService en tv2
//奥本戈拉霍拉酒店
insertoEnBD();
//数据基础插件(网络服务)
布尔res=真;
返回res;
}
受保护的void onPostExecute(void参数){
pd.解散();
}
}

我无法理解这一点,我在类中声明了dialog,然后在asynctask类中使用了pd?我尝试了这段代码,它显示了一个force close by nullpointer异常。您必须将两个类放在同一个.java文件中。我没有发现asynctask实现中有任何错误,您如何知道在进度条启动之前任务已完成ed.根据您的描述,除了2秒的冻结外,我想说这是我对您的AsyncTask的期望:进度条显示->任务快速完成->进度条被解除。因为我的ui被刷新并更改数据..在我看到进度条启动后..我建议注释掉doInBackground()中的所有代码,只需执行Log.i(标记“do something”)即可查看UI刷新是否来自您的doInBackground()。通过执行此操作,您还可以在Logcat中检查是否在onPreExecute()之后调用了doInBackground().我想你的代码中可能还有其他地方在主线程中执行同样繁重的任务,这就是为什么单击“刷新”按钮时会出现2秒冻结的原因。