Android Json 和 AsyncTask 错误

Android Json and AsyncTask Error

我编写了一个代码,使用 JSON 表单将数据从 android 应用程序发送到数据库,但是我在发送时遇到了一些错误。

这是class注册:

package com.subhi.tabhost;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Pattern;

import AddUser.AllUsersLoadSpinner;
import ConnectionDetector.ConnectionDetector;
import SpinnerFirstLoad.MultiSelectionSpinner;
import SpinnerFirstLoad.PlayersLoadSpinner;
import SpinnerFirstLoad.TeamsLoadSpinner;

public class Registeration extends AppCompatActivity {

    ConnectionDetector connectionDetector;
    private MultiSelectionSpinner multiSelectionSpinner;
    private MultiSelectionSpinner PlayersSelectSpinier;
    Button save;
    TextView name, email, userexists;

    ArrayList<String> TeamsList = new ArrayList<String>();
    ArrayList<String> UsersList = new ArrayList<String>();
    ArrayList<String> PlayersList = new ArrayList<String>();
    public static final String MyPREFERENCES = "MyPrefs";
    public static final String Name = "nameKey";
    public static final String EMAIL = "emailKey";
    SharedPreferences sharedpreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registeration);


        sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

        String restoredText = sharedpreferences.getString(Name, null);
       /* if (restoredText != null) {
           // Intent intent = new Intent(getApplicationContext(), MainMenu.class);
            //startActivity(intent);
           // finish();

        }*/

        sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);


       // if (connectionDetector.isConnectingToInternet()) {
            name = (TextView) findViewById(R.id.name);
            email = (TextView) findViewById(R.id.email);
            userexists = (TextView) findViewById(R.id.btnLinkToLoginScreen);


            save = (Button) findViewById(R.id.btnRegister);
            multiSelectionSpinner = (MultiSelectionSpinner) findViewById(R.id.mySpinner);
            PlayersSelectSpinier = (MultiSelectionSpinner) findViewById(R.id.mySpinner2);

            TeamsLoadSpinner x1 = new TeamsLoadSpinner(this);
            x1.execute("http://192.168.1.106/add/index.php");

            AllUsersLoadSpinner allUsersLoadSpinner = new AllUsersLoadSpinner(this);
            allUsersLoadSpinner.execute("http://192.168.1.106/add/allusers.php");

            PlayersLoadSpinner x2 = new PlayersLoadSpinner(this);
            x2.execute("http://192.168.1.106/add/print.php");


            save.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    InsertData adduser = new InsertData();

                    String txtname = name.getText().toString();
                    String txtemail = email.getText().toString();
                    if (txtname.equals(""))
                        Toast.makeText(getApplicationContext(), "UserName Cannot Be Empty", Toast.LENGTH_LONG).show();
                    else {
                        if (txtemail.equals(""))
                            Toast.makeText(getApplicationContext(), "Email Cannot Be Empty ", Toast.LENGTH_LONG).show();
                        else {
                            if (isValidEmail(txtemail)) {
                                boolean x = false;

                                for (int i = 0; i < UsersList.size(); i++) {
                                    if (UsersList.get(i).equals(txtname)) {
                                        x = true;
                                    }

                                }
                                if (x == false) {




                                    SharedPreferences.Editor editor = sharedpreferences.edit();

                                    editor.putString(Name, txtname);
                                    editor.putString(EMAIL, txtemail);
                                    editor.commit();




                                    adduser.execute("192.168.1.106/add/add.php", txtname, txtemail, multiSelectionSpinner.getSelectedItemsAsString(), PlayersSelectSpinier.getSelectedItemsAsString());






                                } else {

                                    //Toast.makeText(getApplicationContext(),"USER EXISTS",Toast.LENGTH_LONG).show();

                                    userexists.setText("User Alerady Exists, Please Choose Differnent User name ");
                                }

                            } else
                                Toast.makeText(getApplicationContext(), "Please Enter A valid Email", Toast.LENGTH_LONG).show();

                        }

                    }

                }
            });

       // }else {

            // Internet connection is not present
            // Ask user to connect to Internet
          //  showAlertDialog(Registeration.this, "No Internet Connection",
             //       "You don't have internet connection.", false);
       // }
    }


    public void showAlertDialog(final Context context, String title, String message, Boolean status) {
        AlertDialog alertDialog = new AlertDialog.Builder(context).create();

        // Setting Dialog Title
        alertDialog.setTitle(title);

        // Setting Dialog Message
        alertDialog.setMessage(message);

        // Setting alert dialog icon
        alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);

        // Setting OK Button
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }



    private boolean isValidEmail(String email) {
        Pattern pattern = Patterns.EMAIL_ADDRESS;
        return pattern.matcher(email).matches();
    }


    public void SetTeams(ArrayList<String> list) {

        TeamsList = list;
        String[] stockArr = new String[TeamsList.size()];
        stockArr = TeamsList.toArray(stockArr);
        multiSelectionSpinner.setItems(stockArr);
    }

    public void SetUsers(ArrayList<String> list) {

        UsersList = list;

    }

    public void SetPlayers(ArrayList<String> players) {
        PlayersList = players;


        String[] stockArr = new String[PlayersList.size()];
        stockArr = PlayersList.toArray(stockArr);
        PlayersSelectSpinier.setItems(stockArr);
    }





    private class InsertData extends AsyncTask<String,Void,Boolean>
    {



        @Override
        protected Boolean doInBackground(String... urls) {

            OutputStream os=null;
            InputStream is=null;
            HttpURLConnection conn=null;



            try {



                URL url =new URL(urls[0]);
                JSONObject jsonObject=new JSONObject();
                jsonObject.put("UserName", urls[1]);
                jsonObject.put("Email", urls[2]);
                jsonObject.put("Teams", urls[3]);
                jsonObject.put("Players", urls[4]);
                String message=jsonObject.toString();
                Log.d(message, "Test");
                conn=(HttpURLConnection)url.openConnection();
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(message.getBytes().length);

                conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
                conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");

                conn.connect();

                os=new BufferedOutputStream(conn.getOutputStream());
                os.write(message.getBytes());

                os.flush();

                is=conn.getInputStream();






            } catch (MalformedURLException e) {
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();;
                e.printStackTrace();
                return  false;
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();;
                e.printStackTrace();
                return false;
            } catch (JSONException e) {
                e.printStackTrace();
            }
            finally {

                try {
                    assert os != null;
                    os.close();
                    assert is != null;
                    is.close();

                } catch (IOException e) {

                    e.printStackTrace();
                }

                conn.disconnect();
            }


            return true;
        }



        @Override
        protected void onPostExecute(Boolean result) {
            if(result)
            {

                Toast.makeText(getApplicationContext(),"Insert Success",Toast.LENGTH_LONG).show();;
            }
            else {
                Toast.makeText(getApplicationContext(),"Insert Fail",Toast.LENGTH_LONG).show();;
            }

        }
    }
}

这是 php 代码脚本:

<?php 


require ('config.php');
$con=mysqli_connect($servername,$username,$password,$db);


    $json = file_get_contents('php://input');
$obj = json_decode($json,true);




$txtname=$obj['UserName'];//$_POST['txtname'];
$txtemail=$obj['Email'];//$_POST['txtemail'];
$txtteam=$obj['Teams'];//$_POST['txtemail'];

$txtplayer=$obj['Players'];//$_POST['txtemail'];

mysqli_query($con,"insert into user (UserName,Email,TeamsInterested,PlayersIterested) values('$txtname','$txtemail','$txtteam','$txtplayer') ");
    echo "Inserted";





?>

这是日志猫:

02-11 12:06:15.197 2301-2319/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                                                 Process: com.subhi.tabhost, PID: 2301
                                                 java.lang.RuntimeException: An error occured while executing doInBackground()
                                                     at android.os.AsyncTask.done(AsyncTask.java:300)
                                                     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                     at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                     at java.lang.Thread.run(Thread.java:841)
                                                  Caused by: java.lang.NullPointerException
                                                     at com.subhi.tabhost.Registeration$InsertData.doInBackground(Registeration.java:287)
                                                     at com.subhi.tabhost.Registeration$InsertData.doInBackground(Registeration.java:221)
                                                     at android.os.AsyncTask.call(AsyncTask.java:288)
                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                     at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231) 
                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                     at java.lang.Thread.run(Thread.java:841) 
02-11 12:06:15.201 530-843/? W/ActivityManager:   Force finishing activity com.subhi.tabhost/.Registeration
02-11 12:06:15.265 153-502/? W/genymotion_audio: out_write() limiting sleep time 42152 to 39909
02-11 12:06:15.469 530-843/? D/dalvikvm: GC_FOR_ALLOC freed 621K, 27% free 9319K/12628K, paused 6ms, total 7ms
02-11 12:06:15.481 530-843/? D/dalvikvm: GC_FOR_ALLOC freed 376K, 27% free 9315K/12628K, paused 12ms, total 12ms
02-11 12:06:15.497 530-545/? D/dalvikvm: GC_FOR_ALLOC freed 13K, 23% free 9791K/12628K, paused 12ms, total 12ms
02-11 12:06:15.501 530-545/? I/dalvikvm-heap: Grow heap (frag case) to 10.747MB for 1127532-byte allocation
02-11 12:06:15.509 530-539/? D/dalvikvm: GC_FOR_ALLOC freed 15K, 21% free 10876K/13732K, paused 11ms, total 11ms

并且日志 cat 错误显示在代码中的两个位置:

1-                    `os.close();`
2-      private class InsertData extends AsyncTask<String,Void,Boolean>

所以如果有人可以帮助我吗?!

我决定使用 Volley 库,它比 HttpUrlConnection 简单多了。

遵循本教程并快乐编码

https://www.youtube.com/watch?v=H-SE1m_A-SA