android.view.windowsleed在dialog.disclose()中显示我时出错

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;

显示在onPostExecute()中调用的dialog.Dislose()中的错误。在onPreExecute()中调用dialog.show()

此任务已被调用到登录活动

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()){