Ponieważ Twój post nie wspomina o działającym pliku PHP, dołączę go ze względu na kompletność. To może potrwać długo (długo ) post....
Więc po pierwsze. To jest przykład pliku PHP, który jest przechowywany pod nazwą my_test.php w tej lokalizacji:c:\wamp\www\some_folder_name\my_test.php
(Zobacz historię edycji kodu )
Teraz pozwól mi wyjaśnić ważne części tego PHP. Te parametry należy skonfigurować tak, aby korzystały z Twoich ustawień:
$DB_HOST = 'YOUR_IP_ADDRESS';
$DB_UNAME = 'MYSQL_USERNAME';
$DB_PWD = 'MYSQL_USER'S_PASSWORD';
$DB_DATABASE = 'DATABASE_NAME';
Adres IP powinien być adresem localhost lub adresem IP komputera, na którym znajduje się baza danych MySQL. Najlepiej adres IP, aby można było testować na urządzeniach fizycznych. przy użyciu localhost działałby tylko na urządzeniach wirtualnych.
Następnym krokiem jest dodanie kolumn do tablicy, która utworzy pojedynczy rekord (wiersz ) w odpowiedzi JSON. Spójrz na ten wiersz na przykład:
$stuff["id"] = $row['id'];
$stuff["id"]
zasadniczo stanie się tagiem w wynikowym obiekcie JSON, podczas gdy $row['id']
jest tym, co wskazuje nazwę kolumny z tabeli bazy danych. Więc $row["...."]
musi być identyczna z nazwami kolumn w tabeli DB. Podczas gdy $stuff["...."]
może być praktycznie wszystkim. O ile ma to dla Ciebie sens.
Ten wiersz echo(json_encode($response));
dokona konwersji odpowiedź w formacie JSON.
Teraz spójrzmy na kod Java. Najpierw jest klasa, która pomoże ci przeanalizować wynik. Został usunięty z samouczka ze strony internetowej (Nie pamiętam, który ). Po prostu skopiuj i wklej następujący kod w klasie Java. Nie musisz nic zmieniać w tym pliku. Przeczytaj go dobrze, aby zrozumieć, jak to działa. Nazywam się JSONParser (Zobacz historię edycji kodu ):
Na koniec, jak faktycznie uzyskać wynikowy JSON i przeanalizować go w Activity
? / Fragment
.
Analizuję dane w AsyncTask
, co i tak jest wymagane, biorąc pod uwagę, że będziesz wykonywać operację sieciową. (Zobacz historię edycji kodu )
Wskazówki do odnotowania w tej Javie:
- Ten
String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php";
musi mieć adres IP, taki jak 192.168.0.x lub jeśli testujesz na urządzeniu wirtualnym, powinien to być 10.0.2.2 . Wcześniejszy (192.. ) nie będzie działać na emulatorze, a później (10.0... ) nie będzie działać na urządzeniu fizycznym. - W tym:
String TAG_STUFF = "stuff";
,"stuff"
odpowiada temu z pliku PHP:$response["stuff"] = array();
.TAG_STUFF
powinien zasadniczo używać whats w$response["stuff"]
.
Mam nadzieję, że powyższe ma sens. Skomentuj, jeśli potrzebujesz pomocy.;-)
ZAKTUALIZOWANE ROZWIĄZANIEM ROBOCZYM:
To naprawdę bardzo dziwne. Ale mam działające rozwiązanie. Podczas korzystania z kodu OP aplikacja rzeczywiście ulega awarii. Z braku czasu na sprawdzenie, dlaczego się zawiesza, zamiast tego publikuję rozwiązanie bezpośrednio.
Po pierwsze, zamiast trzymać testing
jako niezależną klasę, utwórz ją jako klasę wewnętrzną z powrotem w MainActivity
.
class testing extends AsyncTask<Void, Void, Void> {
....
}
Po drugie, zadeklaruj zmienne globalnie (jParser
, URL_TO_PHP
itp. ), w stosunku do aktualnych deklaracji przed onPreExecute()
. Zobacz kompletne rozwiązanie poniżej dla jasności...
public class MainActivity extends Activity {
JSONParser jParser;
String URL_TO_PHP = "http://testbox.site50.net/test.php";
String TAG_SUCCESS = "success";
String TAG_STUFF = "stuff";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
....
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
new testing().execute();
break;
default:
break;
}
}
private class testing extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... args) {
/* Building Parameters */
List<NameValuePair> params = new ArrayList<>();
/* getting JSON string from URL */
JSONObject json = jParser.makeHttpRequest(URL_TO_PHP, "GET", params);
try {
/* Checking for SUCCESS TAG */
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
JSONArray JAStuff = json.getJSONArray(TAG_STUFF);
/** CHECK THE NUMBER OF RECORDS **/
int intStuff = JAStuff.length();
if (intStuff != 0) {
for (int i = 0; i < JAStuff.length(); i++) {
JSONObject JOStuff = JAStuff.getJSONObject(i);
Log.e("ALL THE STUFF", JOStuff.toString());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
}
Podczas testów zrobiłem też zrzut ekranu z wynikami. Oto on:
Ponownie, ponieważ jestem trochę rozciągnięty w tej chwili, nie będę w stanie dowiedzieć się, co tak naprawdę powoduje awarię w kodzie OP. Ale to wystarczająco intrygujące, aby się dowiedzieć...