当前位置: 首页 > 知识库问答 >
问题:

如何在异步任务中使用进度对话框[duplicate]

许招
2023-03-14

我想使用进度对话框与异步任务,我怎么能使用它。我试过了,但它在得到响应后向我显示对话框,这是我的调用函数。由于我预计我面临的问题是由于此应用程序响应 = reqClient.execute(.get();因为我还必须从此异步任务中获取返回值。因此,请参阅两个文件以进行折射

 void postHttpRequest(String userId,String pass,TextView error){
            RequestClient reqClient = new RequestClient(IweenTravelLoginPage.this);
            String AppResponse = null;
            try {
                url = "";
                Log.d("Http Post URL is ", url);
                AppResponse = reqClient.execute().get();

                String status = ValidateLoginStatus.checkLoginStatus(AppResponse);
                Log.d("Status recived", status);

                if(status.equals("200")){
                    saveInformation(userId,pass);
                    startingActivity();
                }else{
                    error.setText("Incorrect UserName or Password");
                }
            } catch (Exception e) {
                Log.e("Exception Occured", "Exception is "+e.getMessage());
            }

此功能用于发送请求

public class RequestClient extends AsyncTask<String, Void, String>{
    Context context;

    public RequestClient(Context c) {
        context = c;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... aurl){
    String responseString="";
    HttpClient client = null;
    try {
         client = new DefaultHttpClient();  
         HttpGet get = new HttpGet(IweenTravelLoginPage.url);
         HttpResponse responseGet = client.execute(get);  
         HttpEntity resEntityGet = responseGet.getEntity();  
         if (resEntityGet != null) {  
             responseString = EntityUtils.toString(resEntityGet);
             Log.i("GET RESPONSE", responseString.trim());
         }
    } catch (Exception e) {
        Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
    }
        Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
        client.getConnectionManager().shutdown();
     return responseString.trim();

    }


    @Override
    protected void onPostExecute(String response) {
         super.onPostExecute(response); 
        }
}

因此,请建议我该怎么做才能显示流程对话框。我尝试了堆栈溢出上的所有示例。但这一切都不适合我。请帮忙

共有3个答案

东方新霁
2023-03-14

为此,您可以在asyncTask中使用onProgressUpdate()。每次从doInBackground()执行showProgressUpdate()时都会调用它

张瀚漠
2023-03-14

在前面的答案的基础上,您可以通过修改listener函数来获取从Async任务返回的数据,该函数接受一个参数,该参数是返回数据

public interface OnTaskCompleted{
    void onTaskCompleted(String response);
}

然后在Async任务的postExecute函数中,让它使用返回数据调用侦听器

    @Override
    protected void onPostExecute(String response){
        //your stuff
        listener.onTaskCompleted(response);
    }

然后在调用Async任务的地方,您只需要实现侦听器。您可以让一个类实现侦听器或使用匿名类

OnTaskCompleted listener = new OnTaskCompleted() {
    void onTaskCompleted(String response){
        // We got return data from the Async Task, do stuff!
    }
};
RequestClient reqClient = new RequestClient(listener);
reqClient.execute();

为了显示进度对话框,您应该在调用异步任务之前将其设置为显示,然后一旦您收到来自Aysnc任务的回调,您就可以将其关闭。

//make progressDialog a member of your class
progressDialog = new ProgressDialog(IweenTravelLoginPage.this);
progressDialog.setMessage("Loading");
progressDialog.show();

OnTaskCompleted listener = new OnTaskCompleted() {
    void onTaskCompleted(String response){
        // get rid of the progress dialog
        progressDialog.dismiss;
        // We got return data from the Async Task, do stuff!
    }
};
RequestClient reqClient = new RequestClient(listener);
reqClient.execute();
喻子航
2023-03-14

你可以试试这个

extends AsyncTask<String, Void, String>{
Context context;

public RequestClient(Context c) {
    context = c;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    progressDialog = new ProgressDialog(context);
    progressDialog.setMessage("Loading. Please Wait");
    progressDialog.setIndeterminate(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setCancelable(true);
    progressDialog.show();
}

@Override
protected String doInBackground(String... aurl){
String responseString="";
HttpClient client = null;
try {
     client = new DefaultHttpClient();  
     HttpGet get = new HttpGet(IweenTravelLoginPage.url);
     HttpResponse responseGet = client.execute(get);  
     HttpEntity resEntityGet = responseGet.getEntity();  
     if (resEntityGet != null) {  
         responseString = EntityUtils.toString(resEntityGet);
         Log.i("GET RESPONSE", responseString.trim());
     }
} catch (Exception e) {
    Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
}
    Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
    client.getConnectionManager().shutdown();
 return responseString.trim();

}


@Override
protected void onPostExecute(String response) {
     super.onPostExecute(response); 
     progressDialog.dismiss();
        }
}
 类似资料:
  • 当我单击登录按钮时,我想显示,并且移动到另一个页面需要时间。我该怎么做?

  • 问题内容: 我正在Flask中编写一个应用程序,除了同步和阻塞之外,它的运行情况非常好。我特别有一项任务,该任务调出第三方API,该任务可能需要几分钟才能完成。我想拨打该电话(实际上是一系列电话)并使其运行。同时控制权返回给Flask。 我的看法如下: 现在,我要做的就是 运行并提供在方法返回时要执行的回调,而Flask可以继续处理请求。这是我需要Flask异步运行的唯一任务,并且我想就如何最好地

  • 我刚刚更新了 Play!框架到版本 2.1 和 scala 到版本 2.10... 现在我的游戏!应用程序已损坏。似乎Akka API已经发生了变化。我找不到现在使用的阿卡版本,但我认为这是最后一个版本...... 我刚刚阅读了迁移指南:http://doc.akka.io/docs/akka/2.1.0/project/migration-guide-2.0.x-2.1.x.html。 我相应地

  • 8.2 使用异步任务 注意:本节所介绍的功能要求 vim 编译包括 +job 特性。 8.2.1 简单任务体验 前文说到,Vim 的异步任务主要是针对外部命令的。那我们就先以最简单最常见的系统命 令 ls 为例,其功能是列出当前目录下的文件,若在 Windows 操作系统下或可用 dir 命令代替。 首先请在 shell 中进入一个非空目录,便于实践,并在 shell 中执行如下命令: $ ls

  • 问题内容: 我正在尝试制作一个可以帮助我评估从Web资源下载文件的时间的应用程序。我发现了2个样本: 使用Android下载文件,并在ProgressDialog中显示进度 和 http://www.helloandroid.com/tutorials/how-download-fileimage-url- 您的设备 第二个示例显示了较小的下载时间,但是我不明白如何使用它来更新进度对话框。我认为在