Я новый. И здесь, на форуме, и в отношении программирования в целом. В настоящее время я экспериментирую с приложением для Android. Я настроил базу данных localhost mysql, используя WAMPserver, и я хочу запрашивать данные из таблицы в ней, используя скрипт php.
Я выбрал несколько вещей из учебника (http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/), но Android не смог найти класс JSONParser. В соответствии с этот блог это потому, что он использует устаревший метод (DefaultHttpClient). Автор приведенного выше блога предоставляет альтернативный класс JSONParser, который вместо этого использует HttpURLConnection, поэтому я решил создать класс в своем проекте с именем JSONParser & копия вставила туда обновленный класс.
Я использую мой класс FetchCoordsIntentService, который расширяет IntentService, чтобы извлечь адрес из таблицы «клиенты» в mysql (используя скрипт php), а затем геокодировать его (и показать его на карте в потоке пользовательского интерфейса). Бит геокодирования работает нормально (ранее я тестировал его отдельно), но теперь, когда я хочу прочитать адрес из базы данных (вместо предоставления его напрямую), я получаю исключение NullPointerexception. Я предоставил метод onHandleIntent () (который я переопределяю в FetchCoordsIntentService) ниже. Именно здесь происходит запрос к базе данных и геокодирование. Я прокомментировал, где появляется исключение NullPointerException.
Мой вопрос: почему возникает это исключение NullPointerException?
Я постараюсь предоставить больше информации, если это потребуется.
Спасибо за ваше время!
Вот обновленный класс JSONParser:
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
public class JSONParser {
String charset = "UTF-8";
HttpURLConnection conn;
DataOutputStream wr;
StringBuilder result;
URL urlObj;
JSONObject jObj = null;
StringBuilder sbParams;
String paramsString;
public JSONObject makeHttpRequest(String url, String method,
HashMap<String, String> params) {
sbParams = new StringBuilder();
int i = 0;
for (String key : params.keySet()) {
try {
if (i != 0){
sbParams.append("&");
}
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
if (method.equals("POST")) {
// request method is POST
try {
urlObj = new URL(url);
conn = (HttpURLConnection) urlObj.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Charset", charset);
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.connect();
paramsString = sbParams.toString();
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(paramsString);
wr.flush();
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
else if(method.equals("GET")){
// request method is GET
if (sbParams.length() != 0) {
url += "?" + sbParams.toString();
}
try {
urlObj = new URL(url);
conn = (HttpURLConnection) urlObj.openConnection();
conn.setDoOutput(false);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Charset", charset);
conn.setConnectTimeout(15000);
conn.connect();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//Receive the response from the server
InputStream in = new BufferedInputStream(conn.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
Log.d("JSON Parser", "result: " + result.toString());
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
// try parse the string to a JSON object
try {
jObj = new JSONObject(result.toString());
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON Object
return jObj;
}
}
Вот мое переопределение метода onHandleIntent в моем классе FetchCoordsIntentService:
@Override
protected void onHandleIntent(Intent intent) {
Log.i(TAG,"onHandleIntent started ");
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
mJSONParser=new JSONParser();
String company_name;
String address_street;
String address_city;
String address_country;
String objectAddress="";
String errorMessage = "";
List<Address> list=null;
int success=0;
mReceiver=intent.getParcelableExtra(Constants.RECEIVER);
if(geocoder.isPresent()){
try {
//----FETCH COMPANY DETAILS----
HashMap<String,String> params=new HashMap<>();
params.put(TAG_COMPANY_NAME,"Jannes Korv");
//NullPointerException here!
JSONObject json = mJSONParser.makeHttpRequest("http://localhost/test/read.php", "POST", params);Log.d("Company loaded ", json.toString());success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.i(TAG,"Success! ");
JSONArray companyArray = json.getJSONArray(TAG_CUSTOMER_TABLE_NAME);JSONObject companyObj = companyArray.getJSONObject(0);
company_name=companyObj.getString(TAG_COMPANY_NAME);
address_street=companyObj.getString(TAG_ADDRESS_STREET);
address_city=companyObj.getString(TAG_ADRESS_CITY);
address_country=companyObj.getString(TAG_ADRESS_COUNTRY);
objectAddress=address_street+", "+address_city+", "+address_country;
//----GEOCODE COMPANY ADDRESS TO COORDINATES----
list = geocoder.getFromLocationName(objectAddress, 1);
}
else{
Log.i(TAG,"Company not found!");
}
}
catch (JSONException e){
e.printStackTrace();
}
catch (IOException ioException) {
// Catch network or other I/O problems.
errorMessage = getString(R.string.service_not_available);
Log.e(TAG, errorMessage, ioException);
}
catch (IllegalArgumentException illegalArgumentException) {
// Catch invalid address values.
errorMessage = getString(R.string.invalid_address_used);
Log.e(TAG, errorMessage + ". " +
"Address = " + objectAddress, illegalArgumentException);
}
// Handle case where no address was found
if (list == null || list.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.no_address_found);
Log.e(TAG, errorMessage);
}
deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage,"");
} else {
Address address = list.get(0);
double lat = address.getLatitude();
double lng = address.getLongitude();
deliverResultToReceiver(Constants.SUCCESS_RESULT,String.valueOf(lat),String.valueOf(lng));
}
}
}
Вот мой php-скрипт «read.php», который должен извлекать адресные данные из таблицы mysql:
<?PHP
$user_name = "root";
$password = "";
$database = "test";
$server = "localhost";
// array for JSON response
$response = array();
$db_handle=mysqli_connect($server, $user_name, $password, $database);
if (mysqli_connect_errno($db_handle))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else{
// check for post data
if (isset($_POST['company_name'])) {
$company_name = $_POST['company_name'];
$SQL = "SELECT company_name,address_street,address_city,address_country FROM customers WHERE company_name=$company_name";
$result = mysqli_query($db_handle, $SQL);
if(!empty($result)){
if(mysqli_num_rows($result)>0){
$result = mysqli_fetch_array($result);
$customers = array();
$customers["company_name"] = $result["company_name"];
$customers["address_street"] = $result["address_street"];
$customers["address_city"] = $result["address_city"];
$customers["address_country"] = $result["address_country"];
$response["success"] = 1;
$response["customers"] = array();
array_push($response["customers"], $customers);
echo json_encode($response);
}
else{
$response["success"] = 0;
$response["message"] = "0 rows!";
echo json_encode($response);
}
}
else{
$response["success"] = 0;
$response["message"] = "No customers found!";
echo json_encode($response);
}
else{
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
echo json_encode($response);
}
}
mysqli_close($db_handle);
?>
Извините, решил позже, но забыл обновить здесь. Основная проблема заключалась в том, что я протестировал приложение на своем мобильном телефоне и, таким образом, не смог подключиться к localhost на моем компьютере. Это кажется действительно глупым и очевидным задним числом!
Во всяком случае, я решил это, загрузив ngrok на https://ngrok.com/. Эта милая программа позволила мне открыть временный туннель к моему локальному хосту по сгенерированной ссылке. Тот факт, что это также позволило мне отслеживать ответ JSON, также помог мне позже.
Других решений пока нет …