大家好,所以我按照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;
}
}
&GT;
我真的很感激帮助我完全陷入困境:S
P.S:在注册了logcat down后,insta关闭了
logcat:
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
答案 0 :(得分:1)
我怀疑你有NetworkOnMainThreadException
。您无法在ui线程上执行与网络相关的操作。
为此目的,您应该使用Thread
或Asynctask
。
在UserFunctions
你有
JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
在JSONparser中你有
HttpResponse httpResponse = httpClient.execute(httpPost);
// not possible on the ui thread
将http请求移至Asynctask
或Thread
。
http://developer.android.com/reference/android/os/AsyncTask.html
答案 1 :(得分:1)
稍后编辑:
对于localhost问题:我假设您使用的是模拟器,因为您使用的是localhost。如果您没有使用模拟器并且正在设备上进行测试,则必须植入设备才能使其理解本地主机(您必须能够访问主机文件)。
对于模拟器:
如果您使用eclipse作为IDE,请执行以下操作:打开DDMS透视图(右上角或Window-&gt; Open Perspective-&gt; DDMS)。在左侧面板中选择您的模拟器。在右侧面板中,选择File Explorer选项卡并导航到/ system / etc.选择hosts文件,然后单击“Pull from device”(右上角,磁盘符号)。这会将hosts文件保存到您的文件系统。编辑主机文件并添加以下行:10.0.2.2 localhost。保存文件,然后在相同的DDMS透视图中返回eclipse,选择hosts文件并选择“将文件推送到设备”(右上角的电话符号)并选择您的主机文件。
对于其他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的register按钮的onClick代码应该重构为UserFunctions类中注册函数的AsyncTask的onPostExecute代码。
尝试理解asyncTask和Android网络操作最佳实践的概念。如果您有其他问题,请在此处发布。
答案 2 :(得分:0)
首先清除logcat:
$ adb logcat -c
然后再次运行:
$ adb logcat
现在,启动您的应用程序
当应用程序崩溃时,复制logcat输出并将其粘贴到此处。
答案 3 :(得分:0)
您应该使用asyncTask的doinbackground()在后台线程中执行与网络相关的任务