【问题标题】:Android Progress Dialog not showing while executing an async task执行异步任务时未显示 Android 进度对话框
【发布时间】:2016-01-09 09:16:24
【问题描述】:

我试图在使用asynctask 进行 API 调用时显示进度对话框。问题是除非 API 调用完成,否则 ProgressDialog 不会出现。

这是异步任务代码:

public class GetAPIResponse extends AsyncTask<APIRequestModel, Void, String> {

/**
 * Global instance of the HTTP transport.
 */
private final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
Gson gson = new Gson();
public AsyncResponse delegate = null;
Context context;

private ProgressDialog mLoadingDialog;
private Handler mHandler = new Handler();

private void showLoadingDialog(final String title, final String msg) {
    mHandler.post(new Runnable() {
        @Override
        public void run() {
            if (mLoadingDialog == null) {
                mLoadingDialog = ProgressDialog.show(context, title, msg);
            }
            mLoadingDialog.setTitle(title);
            mLoadingDialog.setMessage(msg);
        }
    });
}

private void hideLoadingDialog() {
    mHandler.post(new Runnable() { //Make sure it happens in sequence after showLoadingDialog
        @Override
        public void run() {
            if (mLoadingDialog != null) {
                mLoadingDialog.dismiss();
            }
        }
    });
}

public GetAPIResponse(Context context)
{
    this.context = context;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    showLoadingDialog("", "Creating your account");      
}

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

@Override
protected String doInBackground(APIRequestModel... params) {
    String result = "";
    try {

        HttpRequestFactory httpRequestFactory = createRequestFactory(HTTP_TRANSPORT);
        HttpRequest request = httpRequestFactory
                .buildGetRequest(new GenericUrl(params[0].RequestUrl));

        request.getUrl().put("json", gson.toJson(params[0].KeyValuePair));
        result = request.execute().parseAsString();
    } catch (Exception e) {
        Log.e("GetAPIResponse:", e.getMessage());
    }
    return result;
}

public HttpRequestFactory createRequestFactory(
        final HttpTransport transport) {
    return transport.createRequestFactory(new HttpRequestInitializer() {
        public void initialize(HttpRequest request) {
            GoogleHeaders headers = new GoogleHeaders();
            request.setHeaders(headers);
            JsonHttpParser parser = new JsonHttpParser(new JacksonFactory());
            request.addParser(parser);
        }
    });
}
}

谢谢。

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:
    if (mLoadingDialog == null) {
           mLoadingDialog = ProgressDialog.show(context, title, msg);
    }
    mLoadingDialog.setTitle(title);
    mLoadingDialog.setMessage(msg);
    

    这是上下文的问题,你没有得到上下文所以用

    替换它
    if (mLoadingDialog == null) {
           mLoadingDialog = ProgressDialog(Activityname.this);
    }
    mLoadingDialog.setTitle(title);
    mLoadingDialog.setMessage(msg);
    mLoadingDialog.show();
    

    【讨论】:

    • 我的异步任务在不同的类文件中。所以,它不允许我使用那里的活动类。它显示以下错误:“RegisterActivity 不是封闭类”
    【解决方案2】:

    在您的 GetAPIResponse 类中更新并尝试以下代码

    private ProgressDialog pd;
    
    public GetAPIResponse(Context context)
    {
        this.context = context;
        pd = new ProgressDialog(context);
    }
    
    private void showLoadingDialog(final String title, final String msg) {
        pd.setMessage(msg);
        pd.show();
        pd.setCancelable(false);
        pd.setCanceledOnTouchOutside(false);
    }
    
    private void hideLoadingDialog() {
        pd.hide();
        pd.dismiss();
    }
    

    如下调用这个 asyncTask::

    new GetAPIResponse(context).execute(apiRequestModel);
    

    希望您的其他代码正常工作。

    【讨论】:

    • 你是否将 ProgressDialog pd 设置为全局变量
    • 是的..因为我需要隐藏在 onPostExecute 方法中
    • 通过在这两个函数中给出日志来检查你的函数 showLoadingDialog 和 hideLoadingDialog 在你的程序中被调用了吗?
    • 发布包含异步任务类的完整代码
    • 这是来自调用活动的代码:Context context = RegisterActivity.this; asyncTask = new GetAPIResponse(context); asyncTask.execute(apiRequestModel);
    【解决方案3】:

    一个简单但可能不是最佳的解决方案是在 onCreate 中启动进度对话框,就在您执行异步任务并从异步任务中删除 onPreExecute() 方法之前。还将进度初始化转移到异步任务之外。

     public class MainActivity extends Activity {
      ProgressDialog mDialog;
      ....
       protected void onCreate(){
         //Add remaining code
         if(mDialog==null){
            showLoadingDialog(//send in params);
         }
         asyncTask.execute(apiRequestModel);
    
       }
        public void showLoadingDialog(String title, String message){
            mDialog= new ProgressDialog(this);
            mDialog.setTitle(title);
            mDialog.setMessage(message);
            mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            mDialog.setIndeterminate(true);
            mDialog.setProgress(0);
            mDialog.setCancelable(false);
            mDialog.show();
        } //Close dialog box code
    
        public class GetAPIResponse extends AsyncTask<APIRequestModel, Void, String> {
          //Custom functions that you already have. Leave doInBackground as it is
    
          @Override
            protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if(mDialog!=null){
              mDialog.dismiss();
            }
    
           }
    
        }//Close async task
       }//Close Activity
    

    我在 doInBackground() 中添加了一个可运行 5 秒的可运行文件,而不是您拥有的 http 代码,它对我来说工作正常。如果您遇到任何问题,请告诉我。

    【讨论】:

      【解决方案4】:

      首先参考一下,Asynctask在实际中是如何工作的!!

      这是一个简单的例子,

      class MyTask extends AsyncTask<Void, Void, Void> {
       ProgressDialog pd;
          @Override
          protected void onPreExecute() {
            super.onPreExecute();
             pd = new ProgressDialog(MainActivity.this);
             pd.setMessage("loading");
             pd.show();
          }
      
          @Override
          protected Void doInBackground(Void... params) {
            // Do your request
          }
      
          @Override
          protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (pd != null)
            {
               pd.dismiss();
            }
          }
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        相关资源
        最近更新 更多