-1

in my applicationi want to show my locations from database and i find code do that but i get this error so please help me !! 'here is my MainnActivity '

package com.ry.rhcomptence.accessiblemaroc;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;

public class MainnActivity extends FragmentActivity implements         OnMapReadyCallback {

GoogleMap mGoogleMap;

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

    // Getting reference to SupportMapFragment
    SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);

    // Creating GoogleMap from SupportMapFragment
    //mGoogleMap = fragment.getMap();

    fragment.getMapAsync(this);


    // Setting OnClickEvent listener for the GoogleMap
    /**mGoogleMap.setOnMapClickListener(new OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latlng) {
            addMarker(latlng);
            sendToServer(latlng);
        }
    });*/

    // Starting locations retrieve task
    new RetrieveTask().execute();

}

// Adding marker on the GoogleMaps
private void addMarker(LatLng latlng) {
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latlng);
    markerOptions.title(latlng.latitude + "," + latlng.longitude);
    mGoogleMap.addMarker(markerOptions);
}

// Invoking background thread to store the touched location in Remove MySQL server
private void sendToServer(LatLng latlng) {
    new SaveTask().execute(latlng);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    // Enabling MyLocation button for the Google Map
    /**if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    mGoogleMap.setMyLocationEnabled(true);*/


}


// Background thread to save the location in remove MySQL server
private class SaveTask extends AsyncTask<LatLng, Void, Void> {
    @Override
    protected Void doInBackground(LatLng... params) {
        String lat = Double.toString(params[0].latitude);
        String lng = Double.toString(params[0].longitude);
        String strUrl = "https://accessiblemaroc.000webhostapp.com/save.php";
        URL url = null;
        try {
            url = new URL(strUrl);

            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    connection.getOutputStream());

            outputStreamWriter.write("lat=" + lat + "&lng="+lng);               
            outputStreamWriter.flush();
            outputStreamWriter.close();

            InputStream iStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new
            InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";

            while( (line = reader.readLine()) != null){
                sb.append(line);
            }

            reader.close();
            iStream.close();


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

        return null;
    }

}

// Background task to retrieve locations from remote mysql server
private class RetrieveTask extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... params) {
        String strUrl = "https://accessiblemaroc.000webhostapp.com/retrieve.php";
        URL url = null;
        StringBuffer sb = new StringBuffer();
        try {
            url = new URL(strUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream iStream = connection.getInputStream();              
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));         
            String line = "";               
            while( (line = reader.readLine()) != null){
                sb.append(line);
            }

            reader.close();
            iStream.close();                            

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

    @Override
    protected void onPostExecute(String result) {           
        super.onPostExecute(result);
        new ParserTask().execute(result);
    }

}

// Background thread to parse the JSON data retrieved from MySQL server
private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... params) {
        MarkerJSONParser markerParser = new MarkerJSONParser();
        JSONObject json = null;
        try {
            json = new JSONObject(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<HashMap<String, String>> markersList = markerParser.parse(json);
        return markersList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        for(int i=0; i<result.size();i++){
            HashMap<String, String> marker = result.get(i);
            LatLng latlng = new LatLng(Double.parseDouble(marker.get("lat")), Double.parseDouble(marker.get("lng")));
            addMarker(latlng);
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
   }

'here where is the problem MarkerJSONParser.JAVA :'

package com.ry.rhcomptence.accessiblemaroc;

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MarkerJSONParser {

/** Receives a JSONObject and returns a list */
public List<HashMap<String,String>> parse(JSONObject jObject){      

    JSONArray jMarkers =null;
    try {           
        /** Retrieves all the elements in the 'markers' array */
        jMarkers = jObject.getJSONArray("markers");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    /** Invoking getMarkers with the array of json object
     * where each json object represent a marker
     */
    return getMarkers(jMarkers);
}


private List<HashMap<String, String>> getMarkers(JSONArray jMarkers){
    int markersCount = jMarkers.length();
    List<HashMap<String, String>> markersList = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> marker = null;  

    /** Taking each marker, parses and adds to list object */
    for(int i=0; i<markersCount;i++){
        try {
            /** Call getMarker with marker JSON object to parse the marker */
            marker = getMarker((JSONObject)jMarkers.get(i));
            markersList.add(marker);
        }catch (JSONException e){
            e.printStackTrace();
        }
    }

    return markersList;
}

/** Parsing the Marker JSON object */
private HashMap<String, String> getMarker(JSONObject jMarker){

    HashMap<String, String> marker = new HashMap<String, String>();
    String lat = "-NA-";
    String lng ="-NA-";


    try {
        // Extracting latitude, if available
        if(!jMarker.isNull("lat")){
            lat = jMarker.getString("lat");
        }

        // Extracting longitude, if available
        if(!jMarker.isNull("lng")){
            lng = jMarker.getString("lng");
        }                   

        marker.put("lat", lat);
        marker.put("lng", lng);         

    } catch (JSONException e) {         
        e.printStackTrace();
    }       
    return marker;
}

}

'and finally this is the ERROR'

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
              java.lang.RuntimeException: An error occured while executing doInBackground()
                  at android.os.AsyncTask$3.done(AsyncTask.java:299)
                  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
                  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
                  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
                  at java.lang.Thread.run(Thread.java:856)
               Caused by: java.lang.NullPointerException
                  at com.ry.rhcomptence.accessiblemaroc.MarkerJSONParser.parse(MarkerJSONParser.java:19)
                  at com.ry.rhcomptence.accessiblemaroc.MainnActivity$ParserTask.doInBackground(MainnActivity.java:191)
                  at com.ry.rhcomptence.accessiblemaroc.MainnActivity$ParserTask.doInBackground(MainnActivity.java:181)
                  at android.os.AsyncTask$2.call(AsyncTask.java:287)
                  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                  at java.lang.Thread.run(Thread.java:856) 
  • Firstly, use something like Jackson or GSON[http://guides.codepath.com/android/leveraging-the-gson-library] to serialize and deserialize your entire JSON objects. What you are doing is way too tedious and unnecessary because its an universally resolved problem – gaara87 Mar 28 '17 at 00:38
  • secondly, stop using asynctasks to make network calls. Start using a more advanced networking library. https://android-arsenal.com/tag/65 should help you find more. My favorite is retrofit. You are going down the wrong path as step 1. – gaara87 Mar 28 '17 at 00:40
  • i'm just beginner and this code i find it in the web and i used it in my project. so if you can help me to find another code – Radouane El Ayachi Mar 28 '17 at 01:07
  • Search for gson + retrofit2 if you need to fetch data from the network. If you need just a simple storage solution, look into realm. You'll get your answers :) – gaara87 Mar 28 '17 at 01:21

1 Answers1

0

You are not trying to get data in your ParserTask

 private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... params) {
        MarkerJSONParser markerParser = new MarkerJSONParser();
        JSONObject json = null;
        try {
            json = new JSONObject(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<HashMap<String, String>> markersList = markerParser.parse(json);
        return markersList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        for(int i=0; i<result.size();i++){
            HashMap<String, String> marker = result.get(i);
            LatLng latlng = new LatLng(Double.parseDouble(marker.get("lat")), Double.parseDouble(marker.get("lng")));
            addMarker(latlng);
        }
    }
}

You mentioned that this is a:

//Background thread to parse the JSON data retrieved from MySQL server

But you are not retrieving data from your MySQL Server which in return would give you nothing. And when you pass that nothing to your MarkerJSONParser and try to parse nothing. It would result to the NullPointerException.

Kurt Acosta
  • 2,407
  • 2
  • 14
  • 29