【问题标题】:AsyncTask FATAL EXCEPTION. org.json.JSONExceptionAsyncTask 致命异常。 org.json.JSONException
【发布时间】:2013-04-02 12:36:25
【问题描述】:

我正在编写一个 android 登录应用程序,它检查用户是否有效,如果他是有效用户,则启动一个新的 Activity。我是 Android 编程和 PHP 编码的初学者。但是,当我单击登录按钮时,应用程序崩溃了。我正在使用 PHP 代码。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    login=(Button)findViewById(R.id.id_buttonLogin);
    register=(Button)findViewById(R.id.id_buttonSignup);

    phone=(EditText)findViewById(R.id.id_phone);
    password=(EditText)findViewById(R.id.id_password);

    //sPhone=phone.getText().toString();
    //sPassword=password.getText().toString();


    login.setOnClickListener(this);

    register.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent registerOption=new Intent("easy.assign.droid.REGISTRATIONOPTIONACTIVITY");
            startActivity(registerOption);
        }
    });


}

public void onClick(View v) 
{
    new MyAsyncTask().execute();
}

private static String convertStreamToString(InputStream is) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    String result = null;
    try
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        sb.append(reader.readLine() + "\n");

        String line="0";
        while ((line = reader.readLine()) != null) 
        {
                  sb.append(line + "\n");
        }
        is.close();
        result=sb.toString();
    }
    catch(Exception e)
    {
        Log.e("log_tag", "Error converting result "+e.toString());
    }
    return result;  
}//END convertStreamToString()

private class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
        ProgressDialog pDialog;
        @Override
        protected void onPostExecute(Void result) 
        {
            pDialog.dismiss();
            Intent nextpage=new Intent("easy.assign.droid.HOMESTUDENT");
            startActivity(nextpage);
        }

        @Override
        protected void onPreExecute() 
        {
            super.onPreExecute();
            pDialog = new ProgressDialog(LoginActivity.this);
            pDialog.setMessage("Loading data. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) 
        {

            //Create new default HTTPClient
            httpclient = new DefaultHttpClient();

            //Create new HTTP POST with URL to php file as parameter
            httppost = new HttpPost("http://10.0.2.2/project/check.php"); 

            sPhone=phone.getText().toString();
            sPassword=password.getText().toString();
            //Next block of code needs to be surrounded by try/catch block for it to work
            try 
            {
                //Create new Array List
                nameValuePairs = new ArrayList<NameValuePair>(2);

                //place them in an array list
                nameValuePairs.add(new BasicNameValuePair("sPhone", sPhone));
                nameValuePairs.add(new BasicNameValuePair("sPassword", sPassword));

                //Add array list to http post
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


                //assign executed form container to response
                response = httpclient.execute(httppost); //response from the PHP file

                //check status code, need to check status code 200
                if(response.getStatusLine().getStatusCode() == 200)
                {
                    //assign response entity to http entity
                    entity = response.getEntity();

                    //check if entity is not null
                    if(entity != null)
                    {
                        //Create new input stream with received data assigned
                        InputStream instream = entity.getContent();

                        //Create new JSON Object. assign converted data as parameter.
                        jArray = new JSONArray(convertStreamToString(instream));
                        JSONObject json_data = null;
                        String retUser = null, retPass = null;
                        for(int i=0;i<jArray.length();i++)
                        {
                            json_data = jArray.getJSONObject(i);
                            retUser = json_data.get("sphone").toString();
                            retPass = json_data.get("spassword").toString();
                        }

                        //assign json responses to local strings
                        //String retUser = jsonResponse.getString("sphone");//mySQL table field
                        //String retPass = jsonResponse.getString("spassword");

                        //Validate login
                        if(sPhone.equals(retUser)&& sPassword.equals(retPass))
                        { //Check whether 'retUser' and 'retPass' matches username/password 
                            //Display a Toast saying login was a success
                            SharedPreferences sp = getSharedPreferences("login details", 0);
                            SharedPreferences.Editor spedit = sp.edit();

                            spedit.putString("sPhone", sPhone);
                            spedit.putString("sPassword", sPassword);

                            spedit.commit();
                            //Toast.makeText(getBaseContext(), "Successful", Toast.LENGTH_SHORT).show();
                        } 
                        else 
                        {
                            //Display a Toast saying it failed.
                            Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
                        }

                    }
                }
            } 
            catch(Exception e)
            {
                e.printStackTrace();
                //Display toast when there is a connection error
                //Change message to something more friendly
               //Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_SHORT).show();
               Toast.makeText(getBaseContext(), "Connection Error", Toast.LENGTH_SHORT).show();
            }

            return null;
        }
}
}

这是 PHP 代码:

<?php

$connect = mysqli_connect("localhost","root","","easyassigndroid");

if(mysqli_connect_errno($connect))
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
{
    echo "success";
}

$username = isset($_POST['sPhone']) ? $_POST['sPhone'] : '';
$password = isset($_POST['sPassword']) ? $_POST['sPassword'] : '';

$query = mysqli_query($connect, "select * from users where sphone='$username' and spassword='$password' ");

$num = mysqli_num_rows($query);

if($num==1)
{
    while($list = mysqli_fetch_assoc($query))
    {
        $output = $list;
        print(json_encode($output));
    }

    mysqli_close();
}

?>

我收到“org.json.JSONException:java.lang.String 类型的值成功无法转换为 JSONObject”和“致命异常”。另外,我在logcat中得到以下异常:

03-31 11:24:43.337: W/System.err(532): org.json.JSONException: Value success of type java.lang.String cannot be converted to JSONObject
03-31 11:24:43.337: W/System.err(532):  at org.json.JSON.typeMismatch(JSON.java:111)
03-31 11:24:43.367: W/System.err(532):  at org.json.JSONObject.<init>(JSONObject.java:158)
03-31 11:24:43.377: W/System.err(532):  at org.json.JSONObject.<init>(JSONObject.java:171)
03-31 11:24:43.377: W/System.err(532):  at easy.assign.droid.LoginActivity$MyAsyncTask.doInBackground(LoginActivity.java:160)
03-31 11:24:43.377: W/System.err(532):  at   easy.assign.droid.LoginActivity$MyAsyncTask.doInBackground(LoginActivity.java:1)
03-31 11:24:43.407: W/System.err(532):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
03-31 11:24:43.407: W/System.err(532):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-31 11:24:43.417: W/System.err(532):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-31 11:24:43.417: W/System.err(532):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
03-31 11:24:43.447: W/System.err(532):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-31 11:24:43.447: W/System.err(532):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-31 11:24:43.457: W/System.err(532):  at java.lang.Thread.run(Thread.java:856)
03-31 11:24:43.507: W/dalvikvm(532): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
03-31 11:24:43.617: E/AndroidRuntime(532): FATAL EXCEPTION: AsyncTask #1
03-31 11:24:43.617: E/AndroidRuntime(532): java.lang.RuntimeException: An error occured while executing doInBackground()
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.lang.Thread.run(Thread.java:856)
03-31 11:24:43.617: E/AndroidRuntime(532): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.os.Handler.<init>(Handler.java:121)
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.widget.Toast$TN.<init>(Toast.java:317)
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.widget.Toast.<init>(Toast.java:91)
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.widget.Toast.makeText(Toast.java:233)
03-31 11:24:43.617: E/AndroidRuntime(532):  at easy.assign.droid.LoginActivity$MyAsyncTask.doInBackground(LoginActivity.java:194)
03-31 11:24:43.617: E/AndroidRuntime(532):  at easy.assign.droid.LoginActivity$MyAsyncTask.doInBackground(LoginActivity.java:1)
03-31 11:24:43.617: E/AndroidRuntime(532):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
03-31 11:24:43.617: E/AndroidRuntime(532):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-31 11:24:43.617: E/AndroidRuntime(532):  ... 5 more
03-31 11:24:44.507: I/dalvikvm(532): threadid=3: reacting to signal 3
03-31 11:24:44.527: I/dalvikvm(532): Wrote stack traces to '/data/anr/traces.txt'
03-31 11:24:44.797: E/WindowManager(532): Activity easy.assign.droid.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@411ddc48 that was originally added here
03-31 11:24:44.797: E/WindowManager(532): android.view.WindowLeaked: Activity easy.assign.droid.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@411ddc48 that was originally added here
03-31 11:24:44.797: E/WindowManager(532):   at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.Window$LocalWindowManager.addView(Window.java:537)
03-31 11:24:44.797: E/WindowManager(532):   at android.app.Dialog.show(Dialog.java:278)
03-31 11:24:44.797: E/WindowManager(532):   at android.app.ProgressDialog.show(ProgressDialog.java:116)
03-31 11:24:44.797: E/WindowManager(532):   at android.app.ProgressDialog.show(ProgressDialog.java:99)
03-31 11:24:44.797: E/WindowManager(532):   at android.app.ProgressDialog.show(ProgressDialog.java:94)
03-31 11:24:44.797: E/WindowManager(532):   at easy.assign.droid.LoginActivity$MyAsyncTask.onPreExecute(LoginActivity.java:117)
03-31 11:24:44.797: E/WindowManager(532):   at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
03-31 11:24:44.797: E/WindowManager(532):   at android.os.AsyncTask.execute(AsyncTask.java:511)
03-31 11:24:44.797: E/WindowManager(532):   at easy.assign.droid.LoginActivity.onClick(LoginActivity.java:75)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.View.performClick(View.java:3511)
03-31 11:24:44.797: E/WindowManager(532):   at android.view.View$PerformClick.run(View.java:14105)
03-31 11:24:44.797: E/WindowManager(532):   at android.os.Handler.handleCallback(Handler.java:605)
03-31 11:24:44.797: E/WindowManager(532):   at android.os.Handler.dispatchMessage(Handler.java:92)
03-31 11:24:44.797: E/WindowManager(532):   at android.os.Looper.loop(Looper.java:137)
03-31 11:24:44.797: E/WindowManager(532):   at android.app.ActivityThread.main(ActivityThread.java:4424)
03-31 11:24:44.797: E/WindowManager(532):   at java.lang.reflect.Method.invokeNative(Native Method)
03-31 11:24:44.797: E/WindowManager(532):   at java.lang.reflect.Method.invoke(Method.java:511)
03-31 11:24:44.797: E/WindowManager(532):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-31 11:24:44.797: E/WindowManager(532):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-31 11:24:44.797: E/WindowManager(532):   at dalvik.system.NativeStart.main(Native Method)
03-31 11:24:47.237: I/Process(532): Sending signal. PID: 532 SIG: 9

谁能告诉我问题出在哪里?在 PHP 代码、Android 代码还是两者兼有?

【问题讨论】:

  • 原因:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 这给你带来麻烦
  • echo "success" php 中的这一行导致错误...您没有从服务器获取有效的 json ...
  • 我不相信你可以在doInBackground 中使用Toast,你不能从后台线程操作、调用等任何 UI 组件。
  • 你很乱,首先你不能从后台线程中显示Toast,为什么你首先要获取JSONArray?您需要获取根JSONObject,然后获取其子项。
  • @Sajmon 如何获取根 JSONObject?你能告诉我吗? :)

标签: php android authentication android-asynctask


【解决方案1】:

这可能对你有帮助

doInBackground

    sPhone=phone.getText().toString();
    sPassword=password.getText().toString();

您试图从 Edittext 中获取 String 意味着无法在此处绑定 Control 以及

Toast like

runOnUiThread(new Runnable() {
    public void run() {
       Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
   }
});

【讨论】:

  • 我做到了。然而,我不断收到同样的错误。我的代码中的 JSON 部分是否正确?
【解决方案2】:

您试图在doInBackground() 中显示Toast 消息,请在runOnUiThread() 中运行此代码

在 doInBackground() 方法中更改此代码

Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();

还有这个

sPhone=phone.getText().toString();
sPassword=password.getText().toString();

喜欢这个

runOnUiThread(new Runnable() {
   public void run() {
      sPhone=phone.getText().toString();
      sPassword=password.getText().toString();
   }
});

runOnUiThread(new Runnable() {
    public void run() {
       Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
   }
});

【讨论】:

  • 或者,由于这个Toast 是一个成功/失败参数,他可以简单地从那里将状态传递给onPostExecuteToast。结合不同的选择。
  • 我做了你提到的 :) 但是,问题仍然存在 :(
  • 我得到了与我在开始时提到的相同的错误。你知道使用 AsyncTask 登录应用程序的教程吗? :(
【解决方案3】:
new MyAsyncTask().execute();

private class MyAsyncTask extends AsyncTask<Void, Void, Void>

你必须写

new MyAsyncTask().execute(null,null,null);  

【讨论】:

  • 这没有帮助。我得到了我在第一篇文章中提到的相同错误:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多