android.view.windowsleed在dialog.disclose()中显示我时出错
显示在onPostExecute()中调用的dialog.Dislose()中的错误。在onPreExecute()中调用dialog.show() 此任务已被调用到登录活动android.view.windowsleed在dialog.disclose()中显示我时出错,android,Android,显示在onPostExecute()中调用的dialog.Dislose()中的错误。在onPreExecute()中调用dialog.show() 此任务已被调用到登录活动 public class SignInTask extends AsyncTask<String, String, String>{ ProgressDialog dialog; String responseString; SignInActivity appContext;
public class SignInTask extends AsyncTask<String, String, String>{
ProgressDialog dialog;
String responseString;
SignInActivity appContext;
String url;
String pageUrl="signin?";
String emailParameter="email=";
String passwordParameter="pass=";
String user_device="android";
//String userName,passWord;
SignInModel signInModel;
public SignInTask(SignInActivity c,SignInModel model)
{
appContext=c;
signInModel = model;
url=Utility.baseUrl+pageUrl+emailParameter+signInModel.getEmail()+"&"+passwordParameter+signInModel.getPassword()+"&"+user_device;
//url="http://bioscopebd.com/mobileappand/signin";
Log.i("url", url);
}
protected void onPreExecute(){
dialog = new ProgressDialog(appContext);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Login...");
dialog.show();
super.onPreExecute();
}
String filterResponseString(String r)
{
return r.replace("\r\n", "");
}
@Override
protected String doInBackground(String... uri) {
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
try {
response = httpclient.execute(new HttpGet(url));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK){
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
responseString = out.toString();
responseString=filterResponseString(responseString);
}
else
{
//Closes the connection.
response.getEntity().getContent().close();
Utility.showMessage(appContext, "Cannot Connect To Internet");
}
}
catch (Exception e)
{
//TODO Handle problems..
}
return responseString;
}
@Override
protected void onPostExecute(String result)
{
dialog.dismiss();
if(responseString!=null)
{
Log.i("response String", responseString);
//appContext.signInDataLoaded(responseString);
JSONObject jObj;
//SignInModel signIn = new SignInModel();
try {
jObj = new JSONObject(responseString);
signInModel.setStatus( jObj.getBoolean("status") );
signInModel.setUserId( jObj.getString("user_id") );
appContext.signInDataLoaded(signInModel);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else
{
Log.i("response String", "NULL");
}
super.onPostExecute(result);
//Do anything with response..
}
试着这样做。。(仅用此代码将其包围)
我认为您不能使用doInBackground方法与布局交互 尝试替换: showMessage(appContext,“无法连接到Internet”)
使用日志,或者如果您真的想让用户知道,则使用onPostExecute 它实际上不能显示错误, 即使在这种情况下,您必须验证dialog对象是否为null以及是否显示。如下图所示
if(dialog != null && dialog.isShowing()){
dialog.dismise();
}
它将用于避免此类异常。此错误消息最常见的原因是显示对话框的
活动在关闭对话框之前已关闭,导致窗口泄漏
在您的场景中,当您引入AsyncTask
时,执行任务的活动可能已提前终止。例如:用户按下后退键,该活动的清单中没有历史记录属性,或者由于其他原因
也有可能是在执行异步任务之后立即完成活动。在这种情况下,当父窗口终止时,对话框也无法继续存在
为了安全起见,我建议您包括dialog.setCancelable(false)代码>到您的对话框。这将阻止用户完成活动。一旦在到达onPostExecute后关闭对话框,则允许用户完成活动。或者确保您没有完成PostExecute上到达的活动异步任务
或者,另一种方法是将对话框从AsyncTask中取出,并将其附加到活动的生命周期中,您可以在活动的onDestroy中简单地取消对话框。但是我正在任务类中显示我的对话框,然后从我的活动调用任务类。啊,没有看到这一点。抱歉。好的,然后在这里尝试解决方案:您也在解析活动。请尝试解析上下文。我的答案中有很多假设,但如果您为直接答案附加完整的代码(连同活动),这将总是很有帮助的:)是的,我在执行异步任务后正在完成活动,所以这实际上就是问题所在。如果不关闭附加到该活动的所有对话框,则无法优雅地完成该活动。回顾您的设计方法,以避免完成承载对话框的活动,您应该准备好了。我在问题中添加了活动类。在这一点上,我没有什么可以推荐的,因为它完全取决于您的设计方法。然而,您不应该在AsyncTask工作时完成重要活动。可能要等到结果从async返回,然后根据成功或失败,启动相应的活动或显示错误消息。
@Override
public void onClick(View v) {
SignInModel signInModel = new SignInModel();
String email = emailEditText.getText().toString().trim();
String password = passwordEditText.getText().toString().trim();
if(FormHelper.isValidEmail(email) )
signInModel.setEmail(email);
signInModel.setPassword(password);
//Utility.showMessage(SignInActivity.this, signInModel.getEmail()+" "+signInModel.getPassword());
new SignInTask(SignInActivity.this,signInModel).execute();
Intent i=new Intent(SignInActivity.this, HomeActivity.class);
i.putExtra("user_check",1 );
startActivity(i);
finish();
}
});
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
//TODO add your show() and dismiss() here
}
});
if(dialog != null && dialog.isShowing()){