无法将JSON检索到微调器

Hi can you guys help me because I'm stuck here like forever and everytime I'm getting my JSON from my webhost its always null on my webhost and when I'm checking the string using Log.d this error shows NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object

Here are my codes.

PHP to get JSON

<?PHP
include_once("connection.php");

session_start();

$where = '';
if (isset($_GET['driverOwner']) && isset($_GET['roles']) && isset ($_GET['driverStatus'])){
$where = " WHERE driverOwner = '".addslashes($_GET['driverOwner'])."' AND roles = '".addslashes($_GET['roles'])."'  AND driverStatus = '".addslashes($_GET['driverSTatus'])."'";
}

$query = "SELECT * FROM tbl_user ".$where.""; 

$result = mysqli_query($conn, $query);

if($result)

{
while ($row = mysqli_fetch_assoc($result)) {

$data[] = $row;

}

echo json_encode($data);
}

mysqli_close($conn);

?>

Drivers1.java

public class Drivers1 {
int id;
String name;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

Connector

public class Connector {

public static HttpURLConnection connect(String urlAddress){

     try{
        URL url = new URL(urlAddress);
         HttpURLConnection con = (HttpURLConnection) url.openConnection();

         //SET PROPERTIES
         con.setRequestMethod("GET");
         con.setConnectTimeout(20000);
         con.setReadTimeout(20000);
         con.setDoInput(true);
         return con;

     } catch (MalformedURLException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
    return null;
}
}

DataParser.java

public class DataParser extends AsyncTask<Void,Void,Integer> {

Context c;
Spinner spDriver;
String  jsonData;


ProgressDialog pd;
ArrayList<String> driver = new ArrayList<>();


public DataParser(Context c, Spinner sp, String jsonData) {
    this.c = c;
    this.spDriver = sp;
    this.jsonData = jsonData;
}



@Override
protected void onPreExecute() {
    super.onPreExecute();

    pd = new ProgressDialog(c);
    pd.setTitle("Fetch");
    pd.setMessage("Please wait... Getting drivers");
    pd.show();
}

@Override
protected Integer doInBackground(Void... voids) {
    return this.parseData();
}

@Override
protected void onPostExecute(Integer result) {
    super.onPostExecute(result);

    pd.dismiss();

    if(result == 0 ){
        Toast.makeText(c, "Failed", Toast.LENGTH_SHORT).show();
    }else {


        //BIND
        ArrayAdapter adapter = new ArrayAdapter(c,android.R.layout.simple_list_item_1, driver);
        spDriver.setAdapter(adapter);

        spDriver.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(c, driver.get(i), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }
}

private int parseData(){

    try {
        JSONArray ja = new JSONArray(jsonData);
        JSONObject jo = null;

        driver.clear();
        Drivers1 s=null;

        for (int i=0;i<ja.length();i++){
            jo=ja.getJSONObject(i);

            int id=jo.getInt("userID");
            String name=jo.getString("firstname");

            s = new Drivers1();
            s.setId(id);
            s.setName(name);

            driver.add(name);

        }
        return 1;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return 0;
}
}

Downloader.java

public class Downloader extends AsyncTask<Void,Void,String> {

Context c;
String urlAddress;
Spinner spDriver;

ProgressDialog pd;

public Downloader(Context c, String urlAddress, Spinner spDriver) {
    this.c = c;
    this.urlAddress = urlAddress;
    this.spDriver = spDriver;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    pd = new ProgressDialog(c);
    pd.setTitle("Fetch(Downloader)");
    pd.setMessage("Please wait... Getting Drivers");
    pd.show();
}

@Override
protected String doInBackground(Void... voids) {
    return this.downloadData();
}



@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    Log.d("Downloader",""+ s);

    pd.dismiss();

    if (s == null) {
        Toast.makeText(c, "Unable to retrieve", Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(c, "Success!", Toast.LENGTH_SHORT).show();

        //CALL PARSER CLASS TO PARSE
        DataParser parser = new DataParser(c,spDriver,s);
        parser.execute();
    }
}

private String downloadData(){

    HttpURLConnection con = Connector.connect(urlAddress);
    if(con == null){
        return null;
    }

    InputStream is=null;
    try {
        is = new BufferedInputStream(con.getInputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        String line = "";
        StringBuffer response = new StringBuffer();

        if (br != null) {
            while ((line = br.readLine()) != null){
                response.append(line+"
");
            }
        }else {
            return null;
        }


    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(is != null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return null;
}
}

And on the Activity with the spinner.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_insert);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Spinner spDriver = (Spinner) findViewById(R.id.spDriver);

    String url = "http://carkila.esy.es/carkila/getDriver.php?driverOwner="+ pref.getString("username","")+"&roles=driver&driverStatus=active";

    new Downloader(InsertActivity.this,url ,spDriver).execute();
}

Sorry for the long post but please help me. :c thaaaaanks :)

EDIT

Error when Log.d("Downlaoder",s.toString()); is tested on Downloader.java.

Process: com.example.kun.carkila, PID: 31098
                                                                     java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
at com.example.kun.carkila.mMySQL.Downloader.onPostExecute(Downloader.java:56)
at com.example.kun.carkila.mMySQL.Downloader.onPostExecute(Downloader.java:24)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

In your DataParser.Java class result 0 was return regardless.

private int parseData(){

    try {
        JSONArray ja = new JSONArray(jsonData);
        JSONObject jo = null;

        driver.clear();
        Drivers1 s=null;

        for (int i=0;i<ja.length();i++){
            jo=ja.getJSONObject(i);

            int id=jo.getInt("userID");
            String name=jo.getString("firstname");

            s = new Drivers1();
            s.setId(id);
            s.setName(name);

            driver.add(name);

        }
        return 1;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return 0; //here it will go on
}

Please add a log to check what was returned, if it is returning 0 you must get Failed sort of toast.