【问题标题】:Fatal Exception AsyncTask #1 and Android doInBackground()致命异常 AsyncTask #1 和 Android doInBackground()
【发布时间】: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();
       }

   }

}

}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    如果我删除/注释大部分 Log.d 语句,它将运行良好

    似乎我们可以在doInBackground() 方法中的某些日志调用中找到问题。这个如何?

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

    不,看起来不错。下一个呢?

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

    啊哈!我们如何得到这个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

    【讨论】:

    • 您好,当我进入调试模式时,我在语句 JSONObject json = jsonParser.makeHttpRequest(Login_URL, "POST", params); 处设置了一个断点;在我跳过语句之后,json结果为空,不确定问题是什么。
    • 再次感谢,在加密并仔细阅读您的评论后,我回到我的 php 文件,发现问题出在脚本中,我有一些输出信息的 var 转储正在搞砸JSON向上
    【解决方案2】:

    在您的代码之上,请检查 create_product.php 是否存在(在 android 文件夹中)并将 table_name 替换为您的表名并制作 $response["message"] = mysql_error();了解android sdk的logcat中create_product.php有什么问题

    // 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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多