Ich habe eine App mit einer Klasse, die für die Beantragung eines JSON von einem lokalen Server verantwortlich ist ...anfordernden JSON-Dokument mit HttpURLConnection und Parsen es
Hier ist die Hauptaktivität:
public class Activity_main extends AppCompatActivity {
private ArrayList<StructAcount> netAcount = new ArrayList<StructAcount>();
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.txtJSON);
WebService.readUrl("http://localhost/match_picture/service.php?action=read");
String result = WebService.getResult();
if (result != null) {
try {
JSONArray tasks = new JSONArray(result);
for (int i=0; i<tasks.length(); i++) {
StructAcount acount= new StructAcount();
JSONObject object = tasks.getJSONObject(i);
acount.id = object.getLong("user_id");
acount.name = object.getString("user_name");
acount.email = object.getString("user_email");
netAcount.add(acount);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Toast.makeText(Activity_main.this, "hsh" , Toast.LENGTH_SHORT).show();
}
for (StructAcount acount: netAcount) {
textView.setText(textView.getText() + "username: " + acount.name + " | " + "useremail: " + acount.email + "\n");
Toast.makeText(Activity_main.this, "username: " + acount.name + "\n" + "useremail: " + acount.email , Toast.LENGTH_SHORT).show();
}
}
}
. ..und hier ist die Klasse für HTTP-Anfragen:
public class WebService {
private static String result;
public static void readUrl(String server_url) {
class GetJson extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
BufferedReader bufferedReader = null;
String uri = params[0];
try {
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
StringBuilder sb = new StringBuilder();
InputStream in = new BufferedInputStream(con.getInputStream());
bufferedReader = new BufferedReader(new InputStreamReader(in));
String json;
while ((json = bufferedReader.readLine()) != null) {
sb.append(json);
}
return sb.toString().trim();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
WebService.set_result(s);
}
}
GetJson gj = new GetJson();
gj.execute(server_url);
}
public static void set_result(String s) {
result = s;
}
public static String getResult() {
return result;
}
}
zum ersten Mal, dass ich die App laufen, war nichts zu Textview gesetzt.
Wenn die App ist noch auf dem Bildschirm des Emulators: Wenn ich eine kleine Änderung vornehmen, zum Beispiel den Text für ein Toast Nachricht zu ändern, ich die App wieder und Textview Text gesetzt von JSON-Werte laufen ...
Kann jemand Hinweise oder eine Lösung für diese Situation geben?
Grund vielleicht Ihre 'for-Schleife' Bedingung "netAcount" Variablenliste mit den Daten nach dem ersten Start. Versuchen Sie, NetAccount in OnCreate-Methode zu initialisieren. –
Haben Sie die Erlaubnis für das Internet in der AndroidMenifest-Datei erteilt? –
ja. wie gesagt, es funktioniert für den zweiten Lauf – Akilla