2017-11-19 4 views
1

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?

+0

Grund vielleicht Ihre 'for-Schleife' Bedingung "netAcount" Variablenliste mit den Daten nach dem ersten Start. Versuchen Sie, NetAccount in OnCreate-Methode zu initialisieren. –

+0

Haben Sie die Erlaubnis für das Internet in der AndroidMenifest-Datei erteilt? –

+0

ja. wie gesagt, es funktioniert für den zweiten Lauf – Akilla

Antwort

0

Für Studienzwecke könnte HttpUrlConnection nützlich sein.

Im wirklichen Leben empfiehlt Google die Verwendung der Android Volley-Bibliothek.

einige nützliche Links:

Und für die Verwendung von Android Volley mit HTTPS, brauchen Sie nicht die SSL-Zertifikate (bitte nicht tun).

Warum? Die Antwort ist here.

+0

, also brauche ich nicht HttpURLConnection? – Akilla

+0

Ich kann garantieren, dass HttpURLConnection keine gute Wahl für Android ist, da Google 2013 Volley ins Leben gerufen hat: https://www.youtube.com/watch?v=yhv8l9F44qo. – ivanleoncz

+0

Vielen Dank, also ich werde danach gehen. Aber ich denke, in dieser App habe ich die Verbindung hergestellt. Ich ändere den Algorithmus und das Problem gelöst. Ich möchte wissen, was in diesem Algorithmus falsch ist? – Akilla

Verwandte Themen