2014-10-25 3 views
1

안녕하세요. StackOver 플로 프로,치명적인 예외 AsyncTask # 1 및 Android doInBackground()

여기에 약간의 도움이 필요합니다. 나는 PHP 스크립트를 통해 MySql 데이터베이스를 호출하는 안드로이드 응용 프로그램을 실행하고 있습니다. 응용 프로그램을 실행할 때 AsyncTask # 1에 의한 Natal 포인터 예외로 인해 치명적인 예외 오류가 발생합니다. 그것은 doInBackground를 실행하는 동안 발생했다. 이것은 MyBringBack의 지침서입니다. 내가 이것을 며칠 동안 알아 내려고 노력했기 때문에 나는이 문제에 대해 정말로 머리를 감쌀 필요가있다. Log.d 문장의 대부분을 제거/주석 처리하면 정상적으로 실행되지만 JSON 응답에서 일어나는 일들에 대한 태그를 볼 수 없으며, 코드는 아래에 나열되어 있습니다. 누군가가 이것을 알아 내거나 무엇을 말해 줄 수 있습니까? 코드가 잘못되었습니다. 27 : 47.818 : E/JSON 파서 (1041) : 오류 해석 데이터 org.json.JSONException : 여기

는 로그 캣에서 에러 로그

10-25 09 인 값 어레이 (2) 형태의 java.lang.String을 JSONObject로 변환 할 수 없습니다. 10-25 09 : 27 : 47.818 : W/dalvikvm (1041) : threadid = 11 : catch되지 않은 예외 (그룹 = 0xb1b06ba8)로 스레드 종료 10-25 09 : 27 : 47.828 : E/AndroidRuntime (1041) : 프로세스 : com.bobcatservice, PID : 1041 10-25 09 : 27 : 47.828 : E/AndroidRuntime (1041) : 비동기 태스크 # 1 10-25 09 : 27 : 47.828 : E/AndroidRuntime (1041) : java.lang.RuntimeException : doInBackg 실행 중 오류가 발생했습니다. 둥근() 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.ru에서 (ThreadPoolExecutor.java:817) 10-25 09 : 27 : 47.828 : E/AndroidRuntime (1041) : java.lang.Thread.run (Thread.java:841) 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) : ... 자세히 알아보기 10-25 09 : 27 : 49.968 : E/WindowManager (1041) : android.vie w.WindowLeaked : Activity 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) : 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 (대화 상자.자바 : 나는/코멘트가 Log.d 문 그것을 가장 잘 실행됩니다 제거 할 경우 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

의 코드입니다

doInBackground() 방법의 일부 로그 호출에서 문제가있는 것 같습니다. 이건 어때?

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

아니요, 괜찮아 보입니다. 다음은 어때?

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

아하! 변수 json을 어떻게 얻습니까?

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

확인하여 HTTP 요청의 결과, 당신은 아마 여기 null를 얻을.

json이 null이 아니면 어떻게됩니까?

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 결과가 null인데, 문제가 무엇인지 확신 할 수 없다. –

+0

Aga, cyphering 후, 귀하의 의견을 철저하게 읽고 독서, 내 PHP 파일에 가서 스크립트 내에서 문제가 발견, 나는 JSON을 망치고 있던 정보를 출력했다 일부 var 덤프했다 –

1

위의 ur 코드 pls에서 create_product.php가 존재하는지 확인하고 (여기 안드로이드 폴더에 있음) table_name을 테이블 이름으로 바꾸고 $ response [ "message"] = mysql_error();를 작성하십시오.

// 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" /> 
생성합니다 안드로이드 SDK의 로그 캣에 create_product.php에 어떤 문제가 있는지 알고

enter image description here

관련 문제