android asynctask&进度对话框

时间:2015-08-14 13:44:04

标签: java android android-asynctask background

我正在开发一个Android应用程序,我在其中使用asynctasks来执行json rest请求。我的工作正常。我还有一个进度对话框在preexecute上可见,然后在postexecute上解雇它一切正常。见下面的代码。

@Override
protected void onPreExecute(){

    Variables var = Variables.getInstance();
    Variables.getInstance().showPd(ProgressDialog.show(Variables.getInstance().getContext(), var.getValue("loggingin_text"), var.getValue("pleasewait"), true, false));
}    

protected void onPostExecute( JSONObject[] loginresponse ){

    Variables.getInstance().dismisspd();
    try {

        JSONObject responseheader = loginresponse[0].getJSONObject("commonInputParameters");

        if (responseheader.getString("status").equals("SUCCESS")) {

            Variables.getInstance().setUsername( loginresponse[1].getString("username") );
            Variables.getInstance().setSessiontoken(responseheader.getString("userSessionToken"));

            delegate.onRequestCompletion( true );

        } else {

            delegate.onRequestCompletion(false);
        }

    }catch (JSONException je ) {

        this.cancel( true );
    }
}

final Button _loginBTN = ( Button ) findViewById(R.id.loginBTN );
    _loginBTN.setText( vars.getValue( "loginbtn_text" ) );
    _loginBTN.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final Functions functions = Functions.getInstance();
            if( functions.isNetworkAvailable(getApplicationContext())) {
                if (functions.fullypopulated(new Object[]{_username, _password})) {
                    LoginRequest login = new LoginRequest(new responseInterface() {
                        @Override
                        public void onRequestCompletion(boolean successfulRequest) {

                            Variables.getInstance().dismisspd();
                            if ( !successfulRequest ) {

                                functions.showDialog(Variables.getInstance().getValue("login_err"), findViewById(R.id.input_username));
                                functions.clearEditText(new EditText[]{_username, _password});
                                functions.setError(new EditText[]{_username, _password});
                            } else {

                                Intent intent = new Intent(getApplicationContext(), NavigationHandler.class);
                                startActivity(intent);
                                finish();
                            }
                        }

                        @Override
                        public void onRequestCompletion(String requestResponse) {}
                        @Override
                        public void onRequestCompletion(int requestResponse) {}
                        @Override
                        public void onRequestCompletion(float requestResponse) {}
                    });
                    Map<String, String> loginDetails = new HashMap<String, String>();
                    loginDetails.put("username", _username.getText().toString());
                    loginDetails.put("password", _password.getText().toString());
                    login.execute(loginDetails);
                } else {

                    functions.showDialog(Variables.getInstance().getValue("no_details"), findViewById(R.id.input_username));
                    functions.clearEditText(new EditText[]{_username, _password});
                    functions.setError(new EditText[]{_username, _password});
                }
            }
            else {

                functions.showDialog(Variables.getInstance().getValue("no_network"), findViewById(R.id.input_username));
            }
        }
    });

问题在于,当我尝试在异步任务中工作时,进度对话框会显示,但直到它完成后才显示,此时我无法将其删除。

这就是我试图以超时的方式运行它。

try{
       login.execute(loginDetails).get( 5000, TimeUnit.MILLISECONDS );
   }catch (InterruptedException ie ){
   }catch (ExecutionException ee){
   }catch (TimeoutException te ){
       login.cancel(true);
   }

是的我现在知道渔获量是空的。

更新:

不要再介意再次查看get函数,它实际上会阻止UI线程,这就是为什么在ASyncTask完成之前不会显示Progress Dialog的原因。反正有没有实现超时功能?

1 个答案:

答案 0 :(得分:0)

  

取消任务

     

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用 isCancelled()返回true。在调用此方法后,onCancelled(Object)将在doInBackground(Object [])返回后调用而不是onPostExecute(Object)

来自http://developer.android.com/reference/android/os/AsyncTask.html

注意大胆的部分......至于我的理解,如果超时,你应该在onCancelled()中忽略对话。