android.view.WindowLeaked:Activity已泄露窗口com.android.internal.policy.impl.PhoneWindow $ DecorView

时间:2015-11-24 18:17:27

标签: android

我正在使用android登录和注册,我得到了这个错误,我试图解决它但我刚接触到android请帮助我。  ServerRequest.class是

package com.example.aou6kor.samplefragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import java.util.ArrayList;

/**
* Created by Anil on 11/22/2015.
*/
public class ServerRequests {
public ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT=1000*25;
public static final String SERVER_ADDRESS="http://trial.web44.net/";


public ServerRequests(Context context){

    progressDialog=new ProgressDialog(context);
    progressDialog.setCancelable(false);
    progressDialog.setTitle("Processing");
    progressDialog.setMessage("Please wait..");
}

public void storeUserDataInBackground(User user,GetUserCallback userCallback){
    progressDialog.show();
    new StoreUserDataAsyncTask(user,userCallback).execute();
    progressDialog.dismiss();  //new change



}

public void fetchUserDataInBackground(User user,GetUserCallback callback){

    progressDialog.show();
    new fetchUserDataAsyncTask(user,callback).execute();
}

public class StoreUserDataAsyncTask extends AsyncTask<Void,Void,Void>{

    User user;
    GetUserCallback userCallback;

    public StoreUserDataAsyncTask(User user,GetUserCallback userCallback){
        this.user=user;
        this.userCallback=userCallback;

    }
    @Override
    protected Void doInBackground(Void... voids) {
        ArrayList<NameValuePair>dataToSend=new ArrayList<>();
        dataToSend.add(new BasicNameValuePair("name",user.name));
        dataToSend.add(new BasicNameValuePair("username",user.username));
        dataToSend.add(new BasicNameValuePair("phone",user.phone+""));
        dataToSend.add(new BasicNameValuePair("mail",user.mail));
        dataToSend.add(new BasicNameValuePair("password", user.password));


        HttpParams httpParams=new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(httpParams, CONNECTION_TIMEOUT);

        HttpClient client=new DefaultHttpClient(httpParams);
        HttpPost post=new HttpPost(SERVER_ADDRESS+"Register.php");
        try{
            post.setEntity(new UrlEncodedFormEntity(dataToSend));
            client.execute(post);
        }catch (Exception e){
            e.printStackTrace();
        }



        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid){
        progressDialog.dismiss();
        userCallback.done(null);
        super.onPostExecute(aVoid);
    }
}
public class fetchUserDataAsyncTask extends AsyncTask<Void,Void,User> {

    User user;
    GetUserCallback userCallback;

    public fetchUserDataAsyncTask(User user, GetUserCallback userCallback) {
        this.user = user;
        this.userCallback = userCallback;

    }

    @Override
    protected User doInBackground(Void... voids) {
        ArrayList<NameValuePair>dataToSend=new ArrayList<>();
        dataToSend.add(new BasicNameValuePair("username",user.username));
        dataToSend.add(new BasicNameValuePair("password", user.password));

        HttpParams httpParams=new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(httpParams, CONNECTION_TIMEOUT);


        HttpClient client=new DefaultHttpClient(httpParams);
        HttpPost post=new HttpPost(SERVER_ADDRESS+"FetchUserData.php");


        User returnedUser=null;
        try{
            post.setEntity(new UrlEncodedFormEntity(dataToSend));
            HttpResponse httpResponse= client.execute(post);

            HttpEntity entity=httpResponse.getEntity();
            String result= EntityUtils.toString(entity);
            JSONObject jsonObject=new JSONObject(result);

            if(jsonObject.length()==0){
                returnedUser=null;
                return returnedUser;
            }else{
                String name=jsonObject.getString("name");
                int phone=jsonObject.getInt("phone");
                String mail=jsonObject.getString("mail");

                returnedUser =new User(name,user.username,phone,mail,user.password);
            }

        }catch (Exception e){
            e.printStackTrace();
        }




        return returnedUser;
    }
    @Override
    protected void onPostExecute(User returnedUser){
        progressDialog.dismiss();
        userCallback.done(returnedUser);
        super.onPostExecute(returnedUser);
    }

}

 }

我的登录活动是

package com.example.aou6kor.samplefragment;
import android.app.AlertDialog;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Login extends AppCompatActivity implements View.OnClickListener {

Button btLogin;
EditText etUsername,etPassword;
TextView registerLink;
UserLocalStore userLocalStore;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    etUsername=(EditText)findViewById(R.id.etUsername);
    etPassword=(EditText)findViewById(R.id.etPassword);
    registerLink=(TextView)findViewById(R.id.tvRegisterLink);
    btLogin=(Button)findViewById(R.id.btLogin);
    btLogin.setOnClickListener(this);
    registerLink.setOnClickListener(this);
    userLocalStore=new UserLocalStore(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_login, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.btLogin:
            String username=etUsername.getText().toString();
            String password=etPassword.getText().toString();
            User user=new User(username,password);

            authenticate(user);
             userLocalStore.setUserLoggedIn(true);   //storing user data
            userLocalStore.storeUserData(user);
            startActivity(new Intent(this, MainActivity.class));

            break;

        case R.id.btRegister:
                 startActivity(new Intent(this,Register.class));
                   break;
    }

}

private void authenticate(User user){
    ServerRequests serverRequests=new ServerRequests(this);
    serverRequests.fetchUserDataInBackground(user, new GetUserCallback() {
        @Override
        public void done(User returnedUser) {
            if(returnedUser==null){
                showErrorMsg();
            }else {
                logUserIn(returnedUser);
            }
        }
    });
}
private void showErrorMsg(){
    AlertDialog.Builder builder=new AlertDialog.Builder(Login.this);
    builder.setMessage("wrong details");
    builder.setPositiveButton("ok",null);
    builder.show();

}
private  void logUserIn(User returnedUser){
    userLocalStore.storeUserData(returnedUser);
    userLocalStore.setUserLoggedIn(true);

    startActivity(new Intent(this,MainActivity.class));
}

}

logcat中的错误是

- 4733-4733/com.example.aou6kor.samplefragment E/WindowManager﹕ android.view.WindowLeaked: Activity com.example.aou6kor.samplefragment.Login has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{2b1ee4b3 V.E..... R......D 0,0-684,322} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:375)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:298)
            at com.example.aou6kor.samplefragment.ServerRequests.fetchUserDataInBackground(ServerRequests.java:51)
            at com.example.aou6kor.samplefragment.Login.authenticate(Login.java:81)
            at com.example.aou6kor.samplefragment.Login.onClick(Login.java:65)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

logcat中的其他错误是

11-25 07:08:08.114    7403-7403/com.example.aou6kor.samplefragment E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.aou6kor.samplefragment, PID: 7403
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{13f24daf V.E..... R......D 0,0-684,322} not attached to window manager
        at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:386)
        at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:312)
        at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
        at android.app.Dialog.dismissDialog(Dialog.java:341)
        at android.app.Dialog.dismiss(Dialog.java:324)
        at com.example.aou6kor.samplefragment.ServerRequests$fetchUserDataAsyncTask.onPostExecute(ServerRequests.java:159)
        at com.example.aou6kor.samplefragment.ServerRequests$fetchUserDataAsyncTask.onPostExecute(ServerRequests.java:102)
        at android.os.AsyncTask.finish(AsyncTask.java:632)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5312)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

2 个答案:

答案 0 :(得分:1)

在此方法中调用ProgressDialog时已添加public void fetchUserDataInBackground(User user,GetUserCallback callback){ progressDialog.show(); new fetchUserDataAsyncTask(user,callback).execute(); }

public void fetchUserDataInBackground(User user,GetUserCallback callback){
    if (!progressDialog.isShowing()) {
        progressDialog.show();
    }
    new fetchUserDataAsyncTask(user,callback).execute();
}

将其更改为:

newtype LambdaVar = LV Char
  deriving (Eq, Ord)

data Type
  = TBool
  | TNat
  | Arr Type Type
  deriving Eq

data LambdaExpr
  = Abstr LambdaVar Type LambdaExpr
  | App LambdaExpr LambdaExpr
  | Var LambdaVar
  deriving Eq

newtype TypeContext = TC [(LambdaVar, Type)]
  deriving (Eq, Show)

data Expression = Expr TypeContext LambdaExpr Type
  deriving (Eq, Show)

答案 1 :(得分:0)

你试试

 private ProgressDialog PD; 

    if(PD == null){

//
                    PD = new ProgressDialog(SplashScreenActivity.this);
                    PD.setMessage("Please Wait..");
                    PD.setIndeterminate(false);
                    PD.setCancelable(true);
                    PD.show();
            }

你和PrpgressDialog

if(PD.isShowing()){
                    PD.dismiss();
                    goNext();
                }