【问题标题】:How to create a progress dialog inside of AsyncTask?如何在 AsyncTask 中创建进度对话框?
【发布时间】:2016-11-05 12:07:38
【问题描述】:

我有一个返回 StatusCode 的 FullRest API,我成功了,问题是,无法从 AsyncTask 调用进度对话框,我只想向用户“显示”发生了什么,if(statusCode == 201).. POST 成功,到目前为止:

PostBaseClass..

public class PostBase {

private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private String Url="http://192.168.0.101:3000/";

OkHttpClient client = new OkHttpClient();

 int POST(final PostModel model) throws IOException{
     Gson gson = new Gson();
     String modelJson = gson.toJson(model);

     RequestBody body =  RequestBody.create(JSON,modelJson);
     Request request = new Request.Builder()
             .url(Url + "api/gone/POST")
             .post(body)
             .build();
     Response response = client.newCall(request).execute();
     return response.code();
}

MainActivity..

public void MakePost(final PostModel postModel){
    new AsyncTask<Void,Void,Void>(){
        @Override
        protected Void doInBackground(Void... params) {
            try {
                PostBase postBase = new PostBase();
                statusCode = postBase.POST(postModel);
                if(statusCode == 201){
                  //TODO
                }else {
                  //TODO
                }
            } catch (IOException e) {
                e.printStackTrace();

            }
            return null;
        }
    }.execute();
}

【问题讨论】:

    标签: java android android-asynctask progressdialog


    【解决方案1】:

    https://developer.android.com/reference/android/os/AsyncTask.html

    onPreExecuteonPostExecute 在 ui 线程上运行,而您无法从 doInBackground 更新 ui,因为它在后台线程上运行

    所以在onPreExecute 中显示对话框并在onPostExecute 中关闭对话框

    doInBackground 中返回一些值,并根据返回的值在onPostExecute 中执行必要的操作。

    如果您想显示上传进度,可以使用 onProgressUpdate

    new AsyncTask<Void,Void,String>(){
    
        @Override
        protected void onPreExecute()
        {
          super.onPreExecute()
          // runs on the ui thread
          // show dialog
        }  
        @Override
        protected String doInBackground(Void... params) {
            try {
                PostBase postBase = new PostBase();
                statusCode = postBase.POST(postModel);
                if(statusCode == 201){
                  return "successful";
                }else {
                  return "notsuccessful"
                }
            } catch (IOException e) {
                e.printStackTrace();
    
            }
            return "something";
        }
    
        @Override
        protected void onPostExecute(String result)
        {
          super.onPostExecute();
          // dismiss dialog
          if(result.equals("successful")
          {
            // do something on successful
            // runs on the ui thread so do update ui
          }
        }   
    }.execute();
    

    除了 asynctask 代码之外,您似乎在使用 Retrofit。您也可以使用相同的方式进行异步调用。

    【讨论】:

    • 非常感谢!
    【解决方案2】:

    将 ProgressDialog 放在 onPreExecute 中,示例代码如下:

    private ProgressDialog pd;
    
    @Override
    protected void onPreExecute(){ 
       super.onPreExecute();
            pd = new ProgressDialog(yourContext);
            pd.setMessage("Loading...");
            pd.show();    
    }
    
    @Override
    protected void onPostExecute(String result){
       super.onPostExecute(result);
            pd.dismiss();
    }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多