按下登录按钮时强制关闭

时间:2018-08-28 07:58:45

标签: java android login

我有一个项目,当我运行它时,我按下登录按钮,我的应用程序总是强制关闭,但是如果再次启动我的应用程序,则登录状态为true。 错误消息是:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
                  at com.farid.starsrunway.login.LoginActivity$Masuk.onPostExecute(LoginActivity.java:126)
                  at com.farid.starsrunway.login.LoginActivity$Masuk.onPostExecute(LoginActivity.java:81)
                  at android.os.AsyncTask.finish(AsyncTask.java:667)
                  at android.os.AsyncTask.-wrap1(AsyncTask.java)
                  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6157)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)

这是我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.farid.starsrunway">

<uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".login.LoginActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".login.RegisterActivity"
            android:label="Register New User">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".login.LoginActivity" />

            <intent-filter>
                <action android:name="android.intent.action.DETAIL" />

                <category android:name="android.intent.category.DETAIL" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainmenuActivity"
            android:label="Menu Utama">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".login.LoginActivity" />

            <intent-filter>
                <action android:name="android.intent.action.DETAIL" />

                <category android:name="android.intent.category.DETAIL" />
            </intent-filter>
        </activity>
    </application>
</manifest>

这是SessionManager.java

package com.farid.starsrunway.login;

import java.util.HashMap;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

@SuppressLint("CommitPrefEdits")
public class SessionManager {
    // Shared Preferences
    private SharedPreferences pref;

    // Editor for Shared preferences
    private Editor editor;

    // Context
    private Context _context;

    // nama sharepreference
    private static final String PREF_NAME = "Sesi";

    // All Shared Preferences Keys
    private static final String IS_LOGIN = "IsLoggedIn";
    //public static final String KEY_NAME = "nama";
    private static final String KEY_USER = "username";

    // Constructor
    public SessionManager(Context context){
        this._context = context;
        int PRIVATE_MODE = 0;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    /**
     * Create login session
     * */
    public void createLoginSession(String user, String username){
        // Storing login value as TRUE
        editor.putBoolean(IS_LOGIN, true);

        //editor.putString(KEY_NAME, name);
        editor.putString(KEY_USER, username);
        editor.commit();
    }

    /**
     * Check login method wil check user login status
     * If false it will redirect user to login page
     * Else won't do anything
     * */
    public void checkLogin(){
        // Check login status
        if(!this.isLoggedIn()){
            Intent i = new Intent(_context, LoginActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            _context.startActivity(i);
            //((Activity)_context).finish();
        }
    }

    /**
     * Get stored session data
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String, String> user = new HashMap<String, String>();

        //user.put(KEY_NAME, pref.getString(KEY_NAME, null));
        user.put(KEY_USER, pref.getString(KEY_USER, null));

        return user;
    }

    /**
     * Clear session details
     * */
    public void logoutUser(){
        // Clearing all data from Shared Preferences
        editor.clear();
        editor.commit();

        Intent i = new Intent(_context, LoginActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        _context.startActivity(i);
    }
    public boolean isLoggedIn(){
        return pref.getBoolean(IS_LOGIN, false);
    }
}

这是LoginActivity.java

package com.farid.starsrunway.login;

import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.farid.starsrunway.Konfigurasi;
import com.farid.starsrunway.MainmenuActivity;
import com.farid.starsrunway.R;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;

import org.json.JSONArray;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.app.ProgressDialog;
import android.util.Log;
import com.farid.starsrunway.JSONParser;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    EditText EditUser, EditPass;
    Button ButtonLogin, ButtonDaftar, ButtonCancel;
    String url, success;
    SessionManager session;
    String st = "1";
    String benar = "benar";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        success = null;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        session = new SessionManager(getApplicationContext());
        Toast.makeText(getApplicationContext(), "User Login Status: " + session.isLoggedIn(), Toast.LENGTH_LONG).show();

        EditUser = findViewById(R.id.editUser);
        EditPass = findViewById(R.id.editPass);
        ButtonLogin = findViewById(R.id.buttonLogin);
        ButtonCancel = findViewById(R.id.buttonCancel);
        ButtonDaftar = findViewById(R.id.buttonDaftar);

        ButtonLogin.setOnClickListener(this);
        ButtonCancel.setOnClickListener(this);
        ButtonDaftar.setOnClickListener(this);
    }

    public void login(){
        String User = EditUser.getText().toString().trim();
        String Pass = EditPass.getText().toString().trim();
        url = Konfigurasi.URL_LOGIN + "username="
                + User + "&password="
                + Pass;

        if (EditUser.getText().toString().trim().length() > 0 && EditPass.getText().toString().trim().length() > 0) {
            new Masuk().execute();
        } else {
            Toast.makeText(getApplicationContext(), "Username/password masih kosong gan.!!", Toast.LENGTH_LONG).show();
        }
    }

    public void Daftar(){
        startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
    }

    public void cancel(){
        finish();
    }

    @SuppressLint("StaticFieldLeak")
    public class Masuk extends AsyncTask<String, String, String> {
        ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
        ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(LoginActivity.this);
            pDialog.setMessage("Tunggu Bentar ya...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... arg0) {
            JSONParser jParser = new JSONParser();
            JSONObject json = jParser.getJSONFromUrl(url);

            try {
                success = json.getString("success");
                Log.e("error", "nilai sukses=" + success);
                JSONArray hasil = json.getJSONArray("login");
                if (success.equals(benar)) {
                    for (int i = 0; i < hasil.length(); i++) {
                        JSONObject c = hasil.getJSONObject(i);
                        String user = c.getString("username").trim();
                        String pass = c.getString("password").trim();
                        session.createLoginSession(user, pass);
                        Log.e("ok", " ambil data");
                    }
                } else {
                    Log.e("error", "tidak bisa ambil data 0");
                }
            } catch (Exception e) {
                Log.e("error", "tidak bisa ambil data 1");
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pDialog.dismiss();
            if (success.equals(benar)) {
                startActivity(new Intent(LoginActivity.this, MainmenuActivity.class));
            } else {
                Toast.makeText(getApplicationContext(), "Username/password salah..!!", Toast.LENGTH_LONG).show();
            }
        }
    }

    @Override
    public void onClick(View v) {
        if (v == ButtonLogin){
            login();
        }

        if (v == ButtonCancel){
            cancel();
        }

        if (v == ButtonDaftar){
            Daftar();
        }
    }
}

这是JSONParser.java

package com.farid.starsrunway;

import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.util.List;

public class JSONParser {
    static InputStream is = null;
    private static JSONObject jObj = null;
    private static String json = "";

    // constructor
    public JSONParser() {
        //timeout = new Values().gettimeout();
    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      List<NameValuePair> params) {
        // Making HTTP request
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeout = 10000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeout);
            HttpConnectionParams.setSoTimeout(httpParameters, timeout);

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (SocketException ste) {
            Log.e("Timeout Exception: ", ste.toString());
        } catch (ConnectTimeoutException e) {
            Log.e("Timeout Exception: ", e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }
}

这是konfigurasi.java

package com.farid.starsrunway;

public class Konfigurasi {
    //Dibawah ini merupakan Pengalamatan dimana Lokasi Skrip CRUD PHP disimpan
    //Pada tutorial Kali ini, karena kita membuat localhost maka alamatnya tertuju ke IP komputer
    //dimana File PHP tersebut berada
    //PENTING! JANGAN LUPA GANTI IP SESUAI DENGAN IP KOMPUTER DIMANA DATA PHP BERADA
    private static final String BASE_URL     = "http://runway.ikc.co.id/android/";
    public static final String URL_READ     = BASE_URL + "visit/read.php";
    public static final String URL_INSERT   = BASE_URL + "visit/create.php";
    public static final String URL_UPDATE   = BASE_URL + "visit/update.php";
    public static final String URL_DELETE   = BASE_URL + "visit/delete.php?id=";
    public static final String URL_LOGIN    = BASE_URL + "login/login.php?";
    public static final String URL_REGISTER = BASE_URL + "login/register.php";

    //Dibawah ini merupakan Kunci yang akan digunakan untuk mengirim permintaan ke Skrip PHP
    public static final String KEY_ID      = "id";
    public static final String KEY_TANGGAL = "tanggal";
    public static final String KEY_JAM     = "jam"; //alamat itu variabel untuk alamat
    public static final String KEY_LOC     = "lokasi"; //lati itu variabel untuk latitude
    public static final String KEY_KD_TOKO = "kodetoko"; //longi itu variabel untuk longitude
    public static final String KEY_STATUS  = "status";
    public static final String KEY_KD_ASM  = "kodeasm";
    public static final String KEY_TYPE    = "type";
    public static final String KEY_USER    = "username";
    public static final String KEY_PASS    = "password";

    //JSON Tags
    public static final String TAG_SUCCESS   = "success";
    public static final String TAG_VISIT     = "visit";
    public static final String TAG_ID        = "id";
    public static final String TAG_TANGGAL   = "tanggal";
    public static final String TAG_JAM       = "jam";
    public static final String TAG_KD_TOKO   = "kodetoko";
    public static final String TAG_LOC       = "lokasi";
    public static final String TAG_STATUS    = "status";
    public static final String TAG_KD_ASM    = "kodeasm";
}

这是RequestHandler.java

package com.farid.starsrunway;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;

public class RequestHandler {
    //Metode Untuk mengirim httpPostRequest
    //Metode ini mengambil 2 Argumen
    //Metode Pertama adalah URL dari Skrip yang digunakan untuk mengirimkan permintaan
    //Yang lainnya adalah HashMap dengan nilai pasangan nama yang berisi data yang akan dikirim dengan permintaan
    public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) {
        //Membuat URL
        URL url;

        //Objek StringBuilder untuk menyimpan pesan diambil dari server
        StringBuilder sb = new StringBuilder();
        try {
            //Inisialisasi URL
            url = new URL(requestURL);

            //Membuat Koneksi HttpURLConnection
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //Konfigurasi koneksi
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            //Membuat Keluaran Stream
            OutputStream os = conn.getOutputStream();

            //Menulis Parameter Untuk Permintaan
            //Kita menggunakan metode getPostDataString yang didefinisikan di bawah ini
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));

            writer.flush();
            writer.close();
            os.close();
            int responseCode = conn.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {

                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                sb = new StringBuilder();
                String response;
                //Reading server response
                while ((response = br.readLine()) != null){
                    sb.append(response);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    public String sendGetRequest(String requestURL){
        StringBuilder sb =new StringBuilder();
        try {
            URL url = new URL(requestURL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String s;
            while((s=bufferedReader.readLine())!=null){
                sb.append(s).append("\n");
            }
        }catch(Exception ignored){
        }
        return sb.toString();
    }

    public String sendGetRequestParam(String requestURL, String id){
        StringBuilder sb =new StringBuilder();
        try {
            URL url = new URL(requestURL+id);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String s;
            while((s=bufferedReader.readLine())!=null){
                sb.append(s).append("\n");
            }
        }catch(Exception ignored){
        }
        return sb.toString();
    }

    private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        return result.toString();
    }
}

这是gradle:app

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    useLibrary 'org.apache.http.legacy'
    defaultConfig {
        applicationId "com.farid.starsrunway"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

这是login.php

<?php
include "koneksi.php";

$user = $_GET["username"];
$pas  = $_GET["password"];
$pass = md5($pas); 

$query = "SELECT * FROM User WHERE Username='$user' AND Password='$pass' ";

$hasil = mysqli_query($con, $query);
if (mysqli_num_rows($hasil) > 0) {
    $response = array();
    $response["login"] = array();
    while ($data = mysqli_fetch_array($hasil)){
        $login['Id']       = $data['Id'];
        $login['Type']     = $data['Type'];
        $login['Username'] = $data['Username'];
        $login['Password'] = $data['Password'];

        array_push($response["login"], $login);
    }
    $response["success"] = benar;
    echo json_encode($response);
} else {
    $response["success"] = salah;
    $response["message"] = "Tidak ada data";
    echo json_encode($response);
}
?>

请你帮我一下。 我三天前试图解决此问题,但无法解决。

3 个答案:

答案 0 :(得分:1)

这是因为在您的LoginActivity.java第124行中,if (success.equals(benar))的结果为NullPointerException。根据我对您的代码的了解,如果您更改

success = null;

success = "notbenar"; //or basically any value that is not null

在第39行,您的问题应该得到解决。

答案 1 :(得分:0)

Jacob是正确的,success.equals()抛出异常,因为它为null。

在doInBackground中应该抛出了相同的异常,但是您可以对其进行捕获:

participant Bank identified by bankId {
   o String bankId
   o String Name
}

实际上,您的日志应该表明成功为空。

答案 2 :(得分:0)

我相信您在分配值时忘记了双引号。

代替使用:$response["success"] = benar;

尝试:$response["success"] = "benar";

也要修改它,

$response["success"] = salah;
$response["success"] = "salah";