0

大家好,所以我按照 androidhive 登录/注册 android 系统,我添加了名字和姓氏,但是由于某种原因,当我单击注册时,我的应用程序崩溃了 :(。这是我的代码

DBConnect.php

 <?php

class DB_Connect {

    // constructor
    function __construct() {

    }

    // destructor
    function __destruct() {
        // $this->close();
    }

    // Connecting to database
    public function connect() {
        require_once 'config.php';
        // connecting to mysql
        $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
        // selecting database
        mysql_select_db(DB_DATABASE);

        // return database handler
        return $con;
    }

    // Closing database connection
    public function close() {
        mysql_close();
    }

}

?>

添加:DBFunctions.php

<? db = new DB_Connect();
    $this->db->connect();
}

// destructor
function __destruct() {

}

/**
 * Storing new user
 * returns user details
 */
public function storeUser($name, $email, $password) {
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt
    $result = mysql_query("INSERT INTO USERS(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
    // check for successful store
    if ($result) {
        // get user details
        $uid = mysql_insert_id(); // last inserted id
        $result = mysql_query("SELECT * FROM USERS WHERE uid = $uid");
        // return user details
        return mysql_fetch_array($result);
    } else {
        return false;
    }
}

/**
 * Get user by email and password
 */
public function getUserByEmailAndPassword($email, $password) {
    $result = mysql_query("SELECT * FROM USERS WHERE email = '$email'") or die(mysql_error());
    // check for result
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        $result = mysql_fetch_array($result);
        $salt = $result['salt'];
        $encrypted_password = $result['encrypted_password'];
        $hash = $this->checkhashSSHA($salt, $password);
        // check for password equality
        if ($encrypted_password == $hash) {
            // user authentication details are correct
            return $result;
        }
    } else {
        // user not found
        return false;
    }
}

/**
 * Check user is existed or not
 */
public function isUserExisted($email) {
    $result = mysql_query("SELECT email from USERS WHERE email = '$email'");
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        // user existed
        return true;
    } else {
        // user not existed
        return false;
    }
}

/**
 * Encrypting password
 * @param password
 * returns salt and encrypted password
 */
public function hashSSHA($password) {

    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

/**
 * Decrypting password
 * @param salt, password
 * returns hash string
 */
public function checkhashSSHA($salt, $password) {

    $hash = base64_encode(sha1($password . $salt, true) . $salt);

    return $hash;
}

}

?>

我真的很感激帮助,因为我完全卡住了:S

PS:成功注册后的insta关闭发布logcat down

日志猫:

    02-18 21:53:14.245: D/ProgressBar(18032): setProgress = 0
02-18 21:53:14.245: D/ProgressBar(18032): setProgress = 0, fromUser = false
02-18 21:53:14.245: D/ProgressBar(18032): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000
02-18 21:53:14.295: V/g f(18032):  f f
02-18 21:53:14.315: D/ProgressBar(18032): updateDrawableBounds: left = 0
02-18 21:53:14.315: D/ProgressBar(18032): updateDrawableBounds: top = 0
02-18 21:53:14.315: D/ProgressBar(18032): updateDrawableBounds: right = 64
02-18 21:53:14.315: D/ProgressBar(18032): updateDrawableBounds: bottom = 64
02-18 21:53:14.665: V/err(18032): {"tag":"register","success":1,"error":0,"uid":"5303acb7aa41f9.88773766","user":{"name":"yr","email":"g f ","created_at":"2014-02-18 20:55:51","updated_at":null}}
02-18 21:53:14.815: D/AndroidRuntime(18032): Shutting down VM
02-18 21:53:14.815: W/dalvikvm(18032): threadid=1: thread exiting with uncaught exception (group=0x40fbb930)
02-18 21:53:14.820: E/AndroidRuntime(18032): FATAL EXCEPTION: main
02-18 21:53:14.820: E/AndroidRuntime(18032): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.babycare/com.example.babycare.DashboardActivity}; have you declared this activity in your AndroidManifest.xml?
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1635)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1434)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Activity.startActivityForResult(Activity.java:3430)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Activity.startActivityForResult(Activity.java:3391)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Activity.startActivity(Activity.java:3626)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.Activity.startActivity(Activity.java:3594)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at com.example.babycare.RegisterActivity.registerReport(RegisterActivity.java:87)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at com.example.babycare.RegisterTask.onPostExecute(RegisterTask.java:118)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at com.example.babycare.RegisterTask.onPostExecute(RegisterTask.java:1)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.os.AsyncTask.finish(AsyncTask.java:631)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.os.Looper.loop(Looper.java:137)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at android.app.ActivityThread.main(ActivityThread.java:5306)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at java.lang.reflect.Method.invokeNative(Native Method)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at java.lang.reflect.Method.invoke(Method.java:511)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
02-18 21:53:14.820: E/AndroidRuntime(18032):    at dalvik.system.NativeStart.main(Native Method)
02-18 21:53:56.860: I/Process(18032): Sending signal. PID: 18032 SIG: 9
02-18 21:53:57.435: D/dalvikvm(18161): GC_FOR_ALLOC freed 114K, 52% free 3998K/8304K, paused 11ms, total 11ms
02-18 21:53:57.485: I/dalvikvm-heap(18161): Grow heap (frag case) to 16.782MB for 9216016-byte allocation
02-18 21:53:57.500: E/dalvikvm(18161): adjustAdaptiveCoef max=8388608, min=2097152, ut=568
02-18 21:53:57.500: D/dalvikvm(18161): GC_FOR_ALLOC freed 2K, 25% free 12996K/17308K, paused 15ms, total 15ms
02-18 21:53:57.515: E/dalvikvm(18161): adjustAdaptiveCoef max=8388608, min=2097152, ut=368
02-18 21:53:57.515: D/dalvikvm(18161): GC_CONCURRENT freed <1K, 25% free 12996K/17308K, paused 2ms+1ms, total 13ms
02-18 21:53:57.640: D/dalvikvm(18161): GC_FOR_ALLOC freed 9309K, 55% free 11331K/24956K, paused 9ms, total 9ms
02-18 21:53:57.685: D/libEGL(18161): loaded /system/lib/egl/libEGL_mali.so
02-18 21:53:57.685: D/libEGL(18161): loaded /system/lib/egl/libGLESv1_CM_mali.so
02-18 21:53:57.690: D/libEGL(18161): loaded /system/lib/egl/libGLESv2_mali.so
02-18 21:53:57.690: E/(18161): Device driver API match
02-18 21:53:57.690: E/(18161): Device driver API version: 17
02-18 21:53:57.690: E/(18161): User space API version: 17 
02-18 21:53:57.690: E/(18161): mali: REVISION=Linux-r3p1-01rel1 BUILD_DATE=Fri May 10 18:36:49 KST 2013 
02-18 21:53:57.715: D/OpenGLRenderer(18161): Enabling debug mode 0
4

4 回答 4

1

正如我怀疑你有一个NetworkOnMainThreadException。您不能在 ui 线程上进行网络相关操作。

为此,您应该使用 aThread或 a 。Asynctask

UserFunctions你有

JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);

在 JSONparser 你有

HttpResponse httpResponse = httpClient.execute(httpPost); 
// not possible on the ui thread

将 http 请求移至AsynctaskThread

http://developer.android.com/reference/android/os/AsyncTask.html

于 2014-02-18T09:38:20.757 回答
1

后期编辑:

对于本地主机问题:我假设您使用的是模拟器,因为您使用的是本地主机。如果您没有使用模拟器并且您正在设备上进行测试,那么您的设备必须被植根才能使其理解 localhost(您必须能够访问主机文件)。

对于模拟器:

  1. 如果您使用 Eclipse 作为 IDE,请执行以下操作: 打开 DDMS 透视图(右上角或 Window->Open Perspective->DDMS)。在左侧面板中选择您的模拟器。在右侧面板中选择文件资源管理器选项卡并导航到 /system/etc。选择hosts文件并点击“Pull from device”(右上角,磁盘符号)。这会将主机文件保存到您的文件系统中。编辑主机文件并添加以下行:10.0.2.2 localhost。保存文件,然后在同一个 DDMS 透视图中返回 eclipse,选择 hosts 文件并选择“Push a file to device”(右上角的电话符号)并选择您的 hosts 文件。

  2. 对于其他 IDE(我只使用 eclipse,所以我不知道他们的工具)或作为 Eclipse 的替代品,您可以使用 ADB 命令行工具。一个很好的教程是这样的:http: //imagekarthik.wordpress.com/2012/07/16/how-to-modify-android-emulator-hosts-file/

如有其他问题请留言。

好的,所以 logcat 的异常应该这样读:

“NetworkOnMainThreadException”表示您正试图通过网络从 UI 线程(您的活动所在的位置)获取信息。Android 禁止这样做,因为它通常是一个耗时/进程/资源消耗的操作,并且很可能会阻塞 ui 线程并使用户认为应用程序没有响应。

处理这个问题的最好方法是使用AsyncTask。可以在这里找到一个非常好的教程:http ://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

您需要做的是更改 UserFunction 类以使用 asyncTask 进行注册和登录操作。此外,主 Activity 中注册按钮的 onClick 代码应重构为 UserFunctions 类中注册功能的 AsyncTask 的 onPostExecute 代码。

尝试理解 asyncTask 的概念和 android 网络操作的最佳实践。如果您还有其他问题,请在此处发布。

于 2014-02-18T09:49:16.870 回答
0

首先清除你的logcat:

$ adb logcat -c

然后再次运行它:

$亚行日志猫

现在,启动您的应用程序

当应用程序崩溃时,复制 logcat 输出并将其粘贴到此处。

于 2014-02-18T09:35:23.480 回答
0

您应该使用 asyncTask 的 doinbackground() 在后台线程中执行网络相关任务

于 2014-02-18T10:07:47.503 回答