我只想使用PHP访问我的数据库,并在Toast
中查看结果,
但我不知道应该在哪里寻找错误(FATAL EXCEPTION: AsyncTask #2
)。
Android代码:
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if ( ( !username.getText().toString().equals("")) && ( !password.getText().toString().equals("")) )
{
new Connect().execute();
}
else if ( ( !username.getText().toString().equals("")) )
{
Toast.makeText(getApplicationContext(),
"Password field empty", Toast.LENGTH_SHORT).show();
}
else if ( ( !password.getText().toString().equals("")) )
{
Toast.makeText(getApplicationContext(),
"User Name field empty", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(getApplicationContext(),
"User Name and Password field are empty", Toast.LENGTH_SHORT).show();
}
}
});
}
class Connect extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
List<NameValuePair> params= new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username.getText().toString()));
params.add(new BasicNameValuePair("password", password.getText().toString()));
JSONObject json=JSONParser.getJSONFromUrl(loginURL, params);
try {
String login = json.getString(sTag_Login);
if (login=="Admin") {
Toast.makeText(getApplicationContext(), "Welcome Admin", Toast.LENGTH_LONG).show();
}
else if (login=="Customer") {
Toast.makeText(getApplicationContext(), "Welcome", Toast.LENGTH_LONG).show();
}
{
Toast.makeText(getApplicationContext(), "error ", Toast.LENGTH_LONG).show();
}
} catch(JSONException e) {
e.printStackTrace();
}
return null;
}
}
这是我的PHP代码:
<?php
// array for JSON response
$response = array();
$db = mysqli_connect('mysql.hostinger.ae','u641845309_ur','q1p0w2o9','u641845309_song');
// username and password sent from Form and protect MySQL injection for Security purpose
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM customer WHERE UName='$username' and Password='$password'";
// Establishing Connection with Server by passing server_name, user_id and password as a parameter
$result=mysqli_query($db,$sql);
// If result matched $myusername and $mypassword, table row must be 1 row
if ($result)
{
while($row = mysqli_fetch_array($result)) {
if(strtolower($username) == 'admin')
$response["login"] = "Admin";
else
$response["login"] = "Customer";
}
}
else
{
$response["login"] ="error";
}
// echoing JSON response
echo json_encode($response);
JSON代码:
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public static JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
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 + "\n");
}
is.close();
json = sb.toString();
Log.e("JSON", json);
} 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;
}
}
这是logcat
:
01-15 13:49:35.770: D/gralloc_goldfish(2098): Emulator without GPU emulation detected.
01-15 13:49:39.800: D/dalvikvm(2098): GC_FOR_ALLOC freed 166K, 7% free 3117K/3348K, paused 54ms, total 68ms
01-15 13:49:39.800: D/InputEventConsistencyVerifier(2098): KeyEvent: ACTION_UP but key was not down.
01-15 13:49:39.800: D/InputEventConsistencyVerifier(2098): in android.widget.LinearLayout{b3d26008 V.E..... ......I. 0,59-455,118}
01-15 13:49:39.800: D/InputEventConsistencyVerifier(2098): 0: sent at 8592505000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_TAB, scanCode=15, metaState=0, flags=0x8, repeatCount=0, eventTime=8592505, downTime=8592401, deviceId=0, source=0x101 }
01-15 13:50:01.560: W/System.err(2098): java.net.UnknownHostException: Unable to resolve host "mwssong.esy.es": No address associated with hostname
01-15 13:50:01.570: W/System.err(2098): at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
01-15 13:50:01.580: W/System.err(2098): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-15 13:50:01.580: W/System.err(2098): at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-15 13:50:01.580: W/System.err(2098): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-15 13:50:01.590: W/System.err(2098): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-15 13:50:01.590: W/System.err(2098): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-15 13:50:01.590: W/System.err(2098): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-15 13:50:01.600: W/System.err(2098): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-15 13:50:01.600: W/System.err(2098): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-15 13:50:01.600: W/System.err(2098): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-15 13:50:01.600: W/System.err(2098): at com.example.e_music.JSONParser.getJSONFromUrl(JSONParser.java:44)
01-15 13:50:01.610: W/System.err(2098): at com.example.e_music.MainActivity$Connect.doInBackground(MainActivity.java:126)
01-15 13:50:01.620: W/System.err(2098): at com.example.e_music.MainActivity$Connect.doInBackground(MainActivity.java:1)
01-15 13:50:01.620: W/System.err(2098): at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-15 13:50:01.620: W/System.err(2098): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-15 13:50:01.640: W/System.err(2098): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-15 13:50:01.640: W/System.err(2098): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-15 13:50:01.650: W/System.err(2098): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-15 13:50:01.650: W/System.err(2098): at java.lang.Thread.run(Thread.java:841)
01-15 13:50:01.670: W/System.err(2098): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
01-15 13:50:01.670: W/System.err(2098): at libcore.io.Posix.getaddrinfo(Native Method)
01-15 13:50:01.670: W/System.err(2098): at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
01-15 13:50:01.670: W/System.err(2098): at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
01-15 13:50:01.670: W/System.err(2098): ... 18 more
01-15 13:50:01.680: E/Buffer Error(2098): Error converting result java.lang.NullPointerException: lock == null
01-15 13:50:01.680: E/JSON Parser(2098): Error parsing data org.json.JSONException: End of input at character 0 of
01-15 13:50:01.680: W/dalvikvm(2098): threadid=12: thread exiting with uncaught exception (group=0xb3a22ba8)
01-15 13:50:01.750: E/AndroidRuntime(2098): FATAL EXCEPTION: AsyncTask #2
01-15 13:50:01.750: E/AndroidRuntime(2098): Process: com.example.e_music, PID: 2098
01-15 13:50:01.750: E/AndroidRuntime(2098): java.lang.RuntimeException: An error occured while executing doInBackground()
01-15 13:50:01.750: E/AndroidRuntime(2098): at android.os.AsyncTask$3.done(AsyncTask.java:300)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
01-15 13:50:01.750: E/AndroidRuntime(2098): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.lang.Thread.run(Thread.java:841)
01-15 13:50:01.750: E/AndroidRuntime(2098): Caused by: java.lang.NullPointerException
01-15 13:50:01.750: E/AndroidRuntime(2098): at com.example.e_music.MainActivity$Connect.doInBackground(MainActivity.java:129)
01-15 13:50:01.750: E/AndroidRuntime(2098): at com.example.e_music.MainActivity$Connect.doInBackground(MainActivity.java:1)
01-15 13:50:01.750: E/AndroidRuntime(2098): at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-15 13:50:01.750: E/AndroidRuntime(2098): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-15 13:50:01.750: E/AndroidRuntime(2098): ... 4 more
答案 0 :(得分:1)
从doInBackground()中删除你的Toast,AsyncTask独立于你的UI活动,所以如果你想在其中调用Toast,你至少应该在这个块中运行它:
ucfirst()
另一个问题是,如果在其中发生任何异常,你的 getJSONFromUrl()函数可能会返回null,因为你在异常处理程序中什么都不做,以防止它返回null。
在 doInBackground()方法中,你试图捕获 JSONException ,但它可能是 NullPointerException ,因为getJSONFromUrl()可能返回null。您需要简要地查看您的代码。考虑使用isEmpty()而不是与空字符串进行比较,正确处理异常
mwssong.esy.es明确了 UnknownHostException ,您是否已将 http:// 添加到其中?
答案 1 :(得分:0)
where I should search when appear FATAL EXCEPTION: AsyncTask #2 error
通常会直接查看后面的行,因为它会给你一个文件和行号出错的地方
Caused by: java.lang.NullPointerException
01-15 13:50:01.750: E/AndroidRuntime(2098): at
com.example.e_music.MainActivity$Connect.doInBackground(MainActivity.java:129)
不要从后台线程更新ui。修理
将您的长时间运行操作(登录检查)和ui更新(吐司)分成适当的方法doInBackground
&amp; onPostExecute
分别返回doInBackground
中的字符串,以便在onPostExecute
class Connect extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username.getText().toString()));
params.add(new BasicNameValuePair("password", password.getText().toString()));
try {
JSONObject json = JSONParser.getJSONFromUrl(loginURL, params);
String login = json.getString(sTag_Login);
if ("Admin".equals(login)) {
return "Welcome Admin";
} else if ("Customer".equals(login)) {
return "Welcome";
}
} catch (JSONException e) {
e.printStackTrace();
}
return "error";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}
}