OnPreExexcute()中的进度对话框无法正常工作

时间:2016-02-03 11:20:47

标签: android

我是Android的新手,面对进度对话框上的问题,虽然无数的问题和答案都在这里,但没有一个对我有用。任何帮助将不胜感激。 我想在app的登录页面上显示一个旋转轮,所有我的Async Task激活都在不同的类中,我将活动参考传递给处理Async Task的HttpClientHelper类。当我点击Login按钮时,会出现进度对话框。 大多数答案都提到在Activity类中实现Async Task,但我创建了一个在后台处理POST / GET的实用程序类。 因此在瘦非活动类中我没有Context的引用,所以我在HttpClientHelper构造函数中传递了LoginActivity.this。 我在这里做错了。由于多次使用POST / Get我可以在每个活动中实现它们。  请查找示例文件这些不是我发布步骤的实际代码

public class LoginActivity extends AppCompatActivity {

 btnSignIn.setOnClickListener(new View.OnClickListener() {

     HttpClientHelper httpClientHelper = new HttpClientHelper(LoginActivity.this);
     JSONObject json = httpClientHelper.postJSON(apiURL
                            , params);

    ...... rest of the code

  }

}

这是HttpClientHelper

public class HttpClientHelper {

    private Activity activity;
    private static HttpURLConnection urlConnection;
    private static String result;
    private static JSONObject jsonObject = null;

    public HttpClientHelper(){

    }
   public HttpClientHelper(Activity activity){
       this.activity=activity;
   }

 public JSONObject postJSON(String url, Map<String, String> params) {
        Params param = new Params(url, params);
        PostAsyncTask myTask = new PostAsyncTask();
        try {
            jsonObject = myTask.execute(param).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

private class PostAsyncTask extends AsyncTask<Params, String, JSONObject> {
        JSONObject json = null;
        ProgressDialog progressDialog;

        public PostAsyncTask(){

        }
        @Override
        protected  void onPreExecute(){
            super.onPreExecute();
            progressDialog = new ProgressDialog(activity);
            progressDialog.setTitle("Login");
            progressDialog.setMessage("Loading..Please Wait");
            progressDialog.setIndeterminate(true);
            progressDialog.setCancelable(true);
            progressDialog.show();
        }

        @Override
        protected JSONObject doInBackground(Params... args) {

            json = HttpClientHelper.getJSONFromURL(args[0].url, args[0].params);
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
            super.onPostExecute(json);
            if (progressDialog.isShowing()) {   
                 progressDialog.dismiss();
            }

        }
    }
}

1 个答案:

答案 0 :(得分:0)

进度对话框与UI相关联,并且不建议将视图中的任何更新放入AsyncTask中。 UI更新或更改应发生在UI线程中。 在您的情况下,可以通过设置AsyncTask的侦听器来实现所需的结果。只需添加一个监听器类并在活动类中实现监听器。

这是一个例子。 HttpResponseListener.java

public interface HttpResponseListener {
    public void httpResponseReceiver(String result);
}

现在在您的LoginActivity中实现如下界面:

public class LoginActivity extends AppCompatActivity implements HttpResponseListener {

    // rest of your code
    // initialize your progress dialogue here and execute the asynctask
    progressDialogue.show();
    myTask.execute();
    myTask.mHttpResponseListener = this;

    @Override
    public void httpResponseReceiver(String result) {
        if(result == null)progressDialogue.dismiss();
        else {
            // Use result to serve your purpose
            progressDialogue.dismiss();
        }   
    }
}

现在在AsyncTask类中,将结果设置为post execute。

private class PostAsyncTask extends AsyncTask<Params, String, JSONObject> {
    JSONObject json = null;
    ProgressDialog progressDialog;
    public HttpResponseListener mHttpResponseListener;

    public PostAsyncTask(){

    }

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

    @Override
    protected JSONObject doInBackground(Params... args) {

        json = HttpClientHelper.getJSONFromURL(args[0].url, args[0].params);
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
        super.onPostExecute(json);
        mHttpResponseListener.httpResponseReceiver("OK");
    }

    @Override
    protected void onCancelled() {
        mHttpResponseListener.httpResponseReceiver(null);
    }
}