【问题标题】:How can I fix a FATAL EXCEPTION: AsyncTask #2 error如何修复 FATAL EXCEPTION: AsyncTask #2 错误
【发布时间】:2016-01-15 18:45:39
【问题描述】:

我只想使用 PHP 访问我的数据库,并在 Toast 中查看结果, 但我不知道应该在哪里查找错误 (FATAL EXCEPTION: AsyncTask #2)。

安卓代码:

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

【问题讨论】:

  • 您可能需要查看堆栈跟踪以查找错误。我在这里看到了几个问题。一个是你有onPostExecute()onProgressUpdate() 采用Strings,但你没有覆盖他们的方法。另一个问题是您试图在doInBackground() 中显示Toasts。您可能需要参考Using AsyncTask 并再次阅读文档。
  • 不,亲爱的,我没有使用 onPostExecute() 也没有使用 onProgressUpdate()
  • Toast 成功了!
  • 第一个问题是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) 但是你还有我上面提到的其他问题
  • @AhmadYousef 因为您发布了您的 mysql 密码(和用户名),请在有人意外访问您的服务器之前更改它们

标签: php android json android-asynctask


【解决方案1】:

从 doInBackground() 中移除你的 Toast,AsyncTask 独立于你的 UI 活动工作,所以如果你想在其中调用 Toast,你至少应该在这个块中运行它:

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                       "Your code is looking very bad!",
                                       Toast.LENGTH_LONG);
                    }
                });

另一个问题是,如果您的 getJSONFromUrl() 函数中发生任何异常,它可能会返回 null,因为您在异常处理程序中没有做任何事情来防止它返回 null。
doInBackground() 方法中,您试图捕获 JSONException,但它可能会是 NullPointerException,因为 getJSONFromUrl() 可能会返回 null。您需要简要检查您的代码。考虑使用 isEmpty() 而不是与空字符串进行比较,正确处理异常。
您清楚了 mwssong.esy.es 的 UnknownHostException,您是否将 http:// 添加到其中?

【讨论】:

    【解决方案2】:
    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)
    

    不要从后台线程更新用户界面。修理 通过在doInBackground 中返回一个字符串以供onPostExecute 使用,分别将您的长时间运行的操作(登录检查)和 ui 更新(toast)分隔为适当的方法,doInBackgroundonPostExecute

    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();
            }
    }
    

    【讨论】:

    • @5624627 可能您的安卓设备无法访问该主机。这将是另一个问题,因为它超出了此帖子/问题“出现致命异常时我应该在哪里搜索”的范围,因为这已在此处得到解答。
    • 这个问题发生了:01-17 06:42:42.027: E/JSON(1339): Customer 01-17 06:42:42.027: E/JSON Parser(1339): Error parsing data org .json.JSONException:java.lang.String 类型的值客户无法转换为 JSONObject
    • 它给了我“客户”,这是真实的结果,但我怎样才能将它转换为对象!我该怎么办?!
    • @AhmadYousef 抱歉,这个问题(“出现致命异常时我应该在哪里搜索”)现已得到解答,并修复了原始崩溃的代码,希望您可能会找到这个答案 ACCEPTABLE(提示提示)。我觉得“我怎样才能将它转换为对象”是你应该问的另一个新问题。
    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多