2014-10-25 6 views
1

Доброе утро StackOver Flow Pros,Fatal Exception AsyncTask # 1 и Android doInBackground()

мне нужна небольшая помощь здесь. Я запускаю приложение для Android, которое вызывается в базу данных MySql с помощью php-скрипта. Когда я запускаю приложение, я получаю ошибку Fatal Exception для AsyncTask # 1, вызванную исключением нулевого указателя. Он сказал, что это произошло во время выполнения doInBackground. Это учебник, который я следую из MyBringBack. Мне действительно нужно обмануть голову, потому что я пытался понять это в течение нескольких дней. Если я удалю/комментирую большинство операторов Log.d, он будет работать нормально, но я не буду видеть теги для того, что происходит из ответов JSON, код указан ниже, может кто-нибудь помочь мне понять это или сказать мне, что неправильно с кодом.

Вот журнал ошибок из LogCat

10-25 09: 27: 47,818: Е/JSON Parser (1041): Ошибка синтаксического анализа org.json.JSONException данные: массив значений (2) типа java.lang.String не может быть преобразована в JSONObject 10-25 09: 27: 47.818: W/dalvikvm (1041): threadid = 11: выход потока с неперехваченным исключением (группа = 0xb1b06ba8) 10-25 09: 27: 47.828 : E/AndroidRuntime (1041): FATAL EXCEPTION: 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: Произошла ошибка при выполнении doInBackg round() 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at 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): at java.util.concurrent.FutureTask.setException (FutureTask. java: 222) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at java.util.concurrent.FutureTask.run (FutureTask.java:242) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at 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.ru n (ThreadPoolExecutor.java:587) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at 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): at com.bobcatservice.Login $ AttemptLogin.doInBackground (Login.java:126) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at com.bobcatservice.Login $ AttemptLogin.doInBackground (Login.java:1) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at android.os.AsyncTask $ 2.call (AsyncTask.java:288) 10-25 09: 27: 47.828: E/AndroidRuntime (1041): at 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.vie w.WindowLeaked: активность com.bobcatservice.Login просочилась в окно com.android.internal.policy.impl.PhoneWindow $ DecorView {b1e8e430 VE .... R ...... D 0,0-684,192}, изначально добавлено здесь 10-25 09: 27: 49.968: E/WindowManager (1041): at 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): at android.app.Dialog.show (Диалог.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(); 
     } 

    } 

} 

}

ответ

1

Если удалить/комментировать большинство заявлений Log.d он будет работать нормально

Похоже, что мы можем найти проблему в некоторых ваших логических вызовах в методе doInBackground(). Как насчет этого?

Log.d("request!", "starting"); 

Нет, кажется, хорошо. А как насчет следующего?

Log.d("Login attempt", json.toString()); 

Aha! Как мы получаем эту переменную json?

JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST", params); 

Проверьте результат вашего запроса HTTP, вы, вероятно, получите null здесь.

Что делать, если json не имеет значения? Ну, у нас есть еще один подозрительный вызов журнала:

Log.d("Login Failure!", json.getString(TAG_MESSAGE)); 

Насколько я помню, если второй аргумент Log.d() является null, вы получаете NullPointerException, поэтому проверить это тоже.

Что делать, если это тоже не проблема? Ну, я предлагаю вам use debugger здесь.

+0

Привет, aga, когда я пошел в режим отладки, я установил точку останова в заявлении JSONObject json = jsonParser.makeHttpRequest (Login_URL, «POST», params); и после того, как я перехожу на утверждение, результат json равен нулю, не уверен, в чем проблема. –

+0

Спасибо, ага, после прошивки и чтения, внимательно прочитав ваш комментарий, я вернулся в свой php-файл и обнаружил, что проблема была в скрипте, у меня было несколько дампов var, которые выводили информацию, которая ввернула JSON вверх –

1

наверху ur code pls check create_product.php существует (здесь, в папке android), и замените имя_таблицы вашим именем таблицы и сделайте $ response ["message"] = mysql_error(); знать, что случилось с create_product.php в LogCat из Android SDK

// url to create send data. This contains the ip address of my machine on which the local server is running. You will write the IP address of your machine 
     private static String url = "http://192.168.***.1:8080/android/create_product.php"; 

create_product.php

<?php 
// array for JSON response 
$response = array(); 
// check for required fields 
if (isset($_POST['id']) && isset($_POST['name'])) { 
$id = $_POST['id']; 
$name = $_POST['name']; 
// include db connect class 
require_once __DIR__ . '/db_connect.php'; 
// connecting to db 
$db = new DB_CONNECT(); 
// mysql inserting a new row 
$result = mysql_query("INSERT INTO table_name(id, name) VALUES('$id', '$name')"); 
// check if row inserted or not 
if ($result) { 
// successfully inserted into database 
$response["success"] = 1; 
$response["message"] = "Product successfully created."; 
// echoing JSON response 
echo json_encode($response); 
} else { 
// failed to insert row 
$response["success"] = 0; 
$response["message"] = mysql_error();; 
// echoing JSON response 
echo json_encode($response); 
} 
} else { 
// required field is missing 
$response["success"] = 0; 
$response["message"] = "Required field(s) is missing"; 
// echoing JSON response 
echo json_encode($response); 
} 
?> 

А также добавить в очевидном этот код еще эта ошибка будет генерировать

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

enter image description here

Смежные вопросы