如何在 AsyncTask 中创建进度对话框?

How to create a progress dialog inside of AsyncTask?

我有一个 FullRest API 其中 returns 一个 StatusCode,我成功了,问题是,无法从 AsyncTask 调用进度对话框,我只想 "show"用户发生了什么,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();
}

主要活动..

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

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

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

因此在 onPreExecute 中显示对话框并在 onPostExecute

中关闭对话框

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

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

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

谢谢