我正在开发一个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的原因。反正有没有实现超时功能?
答案 0 :(得分:0)
取消任务
可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用 isCancelled()返回true。在调用此方法后,onCancelled(Object)将在doInBackground(Object [])返回后调用而不是onPostExecute(Object)。
来自http://developer.android.com/reference/android/os/AsyncTask.html
注意大胆的部分......至于我的理解,如果超时,你应该在onCancelled()
中忽略对话。