LoginActivity已泄露最初添加的窗口

时间:2015-03-23 08:54:13

标签: android web-services android-asynctask

以下是我的代码:

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import com.example.stecs.async.HttpRequest;

public class Login extends Activity implements OnClickListener {
    CheckBox rememberMe;
    Button login;
    EditText email, password;

    // Progress Dialog
    private ProgressDialog pDialog;
    // JSON parser class
    HttpRequest jsonParser = new HttpRequest();

    // php login script location:



    private static final String LOGIN_URL = "http://www.example.com/portal/webservice/get_user_data.php";

    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        // setup input fields
        rememberMe = (CheckBox) findViewById(R.id.checkBox1);
        login = (Button) findViewById(R.id.login);
        email = (EditText) findViewById(R.id.email);
        password = (EditText) findViewById(R.id.password);

        login.setOnClickListener(this);

        // load from SharedPreference
        loadSavedPreference();
    }

    private void loadSavedPreference() {
        SharedPreferences sharedPreference = PreferenceManager
                .getDefaultSharedPreferences(this);
        boolean checkBoxValue = sharedPreference.getBoolean("CheckBox_Value",
                false);
        String name = sharedPreference.getString("storedName", "");
        String pass = sharedPreference.getString("storedPassword", "");
        if (checkBoxValue) {
            rememberMe.setChecked(true);
        } else {
            rememberMe.setChecked(false);
        }

        email.setText(name);
        password.setText(pass);
    }

    private void savePreferences(String key, boolean value) {
        SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        Editor editor = sharedPreferences.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    private void savePreferences(String key, String value) {
        SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    @Override
    public void onClick(View v) {
        savePreferences("CheckBox_Value", rememberMe.isChecked());
        if (rememberMe.isChecked()) {
            savePreferences("storedName", email.getText().toString());
            savePreferences("storedPassword", password.getText().toString());

            finish();
        }
        switch (v.getId()) {
        case R.id.login:
            new AttemptLogin().execute();
            break;
        // Intent in = new Intent(Login.this, IncidentsActivity.class);
        // startActivity(in);
        }

    }

    class AttemptLogin extends AsyncTask<String, String, String> {

        boolean failure = false;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Login.this);
            pDialog.setMessage("Attempting login..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... args) {
            // Check for success tag
            int success = 1;
            String eMail = email.getText().toString();
            String passWord = password.getText().toString();
            try {
                // Building Parameters

                JSONObject jo = new JSONObject();
                jo.put("email", eMail);
                jo.put("password", passWord);

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                String json = jsonParser.postData(LOGIN_URL, jo);

                // check your log for json response
                Log.d("Login attempt", json.toString());

                // json success tag
                if(success == 1){
                    Log.d("Login Credentials - UserName!!!", eMail);
                    Log.d("Login Credentials - Password!!!", passWord);
                    Log.d("Login Successful!", json.toString());
                    Intent i = new Intent(Login.this, IncidentsActivity.class);
//                  finish();
                    startActivity(i);
                    return json;
                }else {
                    Log.d("Login Falure!", json.toString());
                    return json;
                }
//              success = json.getInt(TAG_SUCCESS);
//              if (success == 1) {
//                  Log.d("Login Successful!", json.toString());
//                  Intent i = new Intent(Login.this, IncidentsActivity.class);
//                  finish();
//                  startActivity(i);
//                  return json.getString(TAG_MESSAGE);
//              } else {
//                  Log.d("Login Falure!", json.getString(TAG_MESSAGE));
//                  return json.getString(TAG_MESSAGE);
//              }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        // After completing background task Dismiss the progress dialog

        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
//          pDialog.dismiss();
            if (file_url != null) {
                Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
            }
        }
    }
}

当我登录应用程序时;它崩溃并给我以下给出的错误,该错误是从LOGCAT中提取的: -

03-23 14:14:31.625: E/AndroidRuntime(11543): FATAL EXCEPTION: AsyncTask #4
03-23 14:14:31.625: E/AndroidRuntime(11543): Process: com.karmick.stecs, PID: 11543
03-23 14:14:31.625: E/AndroidRuntime(11543): java.lang.RuntimeException: An error occured while executing doInBackground()
03-23 14:14:31.625: E/AndroidRuntime(11543):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.lang.Thread.run(Thread.java:841)
03-23 14:14:31.625: E/AndroidRuntime(11543): Caused by: java.lang.NullPointerException
03-23 14:14:31.625: E/AndroidRuntime(11543):    at com.karmick.stecs.Login$AttemptLogin.doInBackground(Login.java:161)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at com.karmick.stecs.Login$AttemptLogin.doInBackground(Login.java:1)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-23 14:14:31.625: E/AndroidRuntime(11543):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-23 14:14:31.625: E/AndroidRuntime(11543):    ... 4 more
03-23 14:14:35.185: I/Process(11543): Sending signal. PID: 11543 SIG: 9

请帮帮我。我是新手,非常需要帮助。

非常感谢。

2 个答案:

答案 0 :(得分:0)

doInBackground()

中删除此代码
Intent i = new Intent(Login.this, IncidentsActivity.class);
startActivity(i);

将其添加到onPostExecute()这样的

protected void onPostExecute(String file_url) {
    // dismiss the dialog once product deleted
    //pDialog.dismiss();
    if (file_url != null) {
        Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
    }
    Intent i = new Intent(Login.this, IncidentsActivity.class);
    startActivity(i);
}  

答案 1 :(得分:0)

如果只有AsyncTask使用

,那么首先要做的事情
private ProgressDialog pDialog;

然后不要在AsyncTask之外定义它的不良做法。并从doInBackground中删除所有与UI相关的东西,只有UI线程有权修改视图。

您的开始活动代码应该是onPostExecute()方法。

主要问题是ProgressDialog对象,这就是为什么窗口泄漏错误即将来临,因为你的doInBackground正在崩溃。