【发布时间】:2014-10-25 13:43:04
【问题描述】:
早上好 StackOver Flow 专业人士,
我需要一点帮助。我正在运行一个 Android 应用程序,该应用程序通过 php 脚本调用 MySql 数据库,当我运行该应用程序时,我收到一个由空指针异常引起的 AsyncTask #1 的致命异常错误。它说它发生在执行 doInBackground 时。这是我从 MyBringBack 学习的教程。我真的需要解决这个问题,因为我已经试图解决这个问题好几天了。如果我删除/注释大部分 Log.d 语句,它会运行良好,但我不会看到 JSON 响应中发生的事情的标签,代码列在下面,谁能帮我解决这个问题或告诉我什么代码有问题。
这是来自 logcat 的错误日志
10-25 09:27:47.818:E/JSON Parser(1041):解析数据 org.json.JSONException 时出错:java.lang.String 类型的值数组 (2) 无法转换为 JSONObject 10-25 09:27:47.818: W/dalvikvm(1041): threadid=11: 线程以未捕获的异常退出 (group=0xb1b06ba8) 10-25 09:27:47.828: E/AndroidRuntime(1041): 致命异常: AsyncTask #1 10-25 09:27:47.828: E/AndroidRuntime(1041): 进程: com.bobcatservice, PID: 1041 10-25 09:27:47.828: E/AndroidRuntime(1041): java.lang.RuntimeException: 执行 doInBackground() 时出错 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 android.os.AsyncTask$3.done(AsyncTask.java:300) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:222) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.lang.Thread.run(Thread.java:841) 10-25 09:27:47.828: E/AndroidRuntime(1041): 由: java.lang.NullPointerException 引起 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 com.bobcatservice.Login$AttemptLogin.doInBackground(Login.java:126) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 com.bobcatservice.Login$AttemptLogin.doInBackground(Login.java:1) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 android.os.AsyncTask$2.call(AsyncTask.java:288) 10-25 09:27:47.828: E/AndroidRuntime(1041): 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 10-25 09:27:47.828: E/AndroidRuntime(1041): ... 4 更多 10-25 09:27:49.968: E/WindowManager(1041): android.view.WindowLeaked: Activity com.bobcatservice.Login 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView{b1e8e430 V.E.... .R......D 0,0-684,192} 最初添加在这里 10-25 09:27:49.968: E/WindowManager(1041): 在 android.view.ViewRootImpl.(ViewRootImpl.java:348) 10-25 09:27:49.968: E/WindowManager(1041): 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248) 10-25 09:27:49.968: E/WindowManager(1041): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 10-25 09:27:49.968: E/WindowManager(1041): 在 android.app.Dialog.show(Dialog.java:286)
这是有问题的代码
//AsyncTask is a seperate thread than the thread that runs the GUI
//Any type of networking should be done with asynctask.
class AttemptLogin extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
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) {
// TODO Auto-generated method stub
// Check for success tag
int success;
String username = user.getText().toString();
String password = pass.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
Log.d("request!", "starting");
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
LOGIN_URL, "POST", params);
try {
// check your log for json response
Log.d("Login attempt", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.d("Login Successful!", json.toString());
Intent i = new Intent(Login.this, Welcome.class);
finish();
startActivity(i);
return json.getString(TAG_MESSAGE);
}else{
Log.d("Login Failure!", 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();
}
}
}
}
【问题讨论】: