2017-11-14 1 views
1

abrufen Ich arbeite an einer Anwendung, die Daten aus der Online-MySQL-Datenbank abrufen und als Liste im Aktivitätslayout anzeigen muss.Daten aus der Online MySQL DB in der "onCreate" -Methode der Aktivität

Problem ist, dass meine Anwendungsfehler „Versuch, Interface-Methode‚int java.util.List.size()‘auf ein Null-Objekt Verweis aufrufen“ wird die

In onCreate Methode Ich rufe AsyncTask Klasse zu erhalten Daten vom Server und als unterhalb dieser Linie des Codes ich setze diese Daten durch Adapter zur Listenansicht, die mein Layout ist. Wenn ich diese Aktivität starte, erhalte ich den Fehler.

Sollte ich die Daten vom Server vor dem Start der Aktivität erhalten? Oder das Problem ist etwas anderes? Meine PHP-Datei funktioniert in Ordnung, wenn ich es im Browser überprüfen.

ist hier onCreate Methode:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.invoice_list); 
    final ListView listView1 = (ListView) findViewById(R.id.invoicelist); 
    InvoiceDownloader task = new InvoiceDownloader(); 

    task.execute(new String[] { "http://10.0.2.2/company/getinvoices.php" }); 
    ArrayAdapter<Invoice> adapter = new ArrayAdapter<Invoice>(this, android.R.layout.simple_list_item_1, invoices); 
    listView1.setAdapter(adapter); 
} 

EDIT:

ich es fest, wie Sie alle, schlug nun kein Fehler, Aktivität öffnet, aber es zeigt immer noch keine Daten von Online Datenbank .. hier bearbeitet onCreate() -Methode:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.invoice_list); 
    adapter = new ArrayAdapter<Invoice>(this, android.R.layout.simple_list_item_1); 
    listView1 = (ListView) findViewById(R.id.invoicelist); 
    InvoiceDownloader task = new InvoiceDownloader(); 
    task.execute(new String[] { "http://10.0.2.2/company/getinvoices.php" }); 
    adapter.notifyDataSetChanged(); 
} 

und hier ist AsyncTask Klasse:

public class InvoiceDownloader extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String response = ""; 
     try { 
      response += getHttpContent(params[0]); 
     } catch (IOException e) { 
      Log.e("error", e.toString()); 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     adapter.addAll(invoices); 
     listView1.setAdapter(adapter); 

     Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); 
    } 

    public String getHttpContent(String urlStr) throws IOException { 

     String response = ""; 

     try { 
      URL url = new URL(urlStr); 
      HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 

      StringBuilder sb = new StringBuilder(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); 
      String json; 
      while ((json = bufferedReader.readLine()) != null) { 
       sb.append(json + "\n"); 
      } 

      JSONArray jsonArray = new JSONArray(sb.toString().trim()); 

      for (int i = 0; i < jsonArray.length(); i++) { 
       Invoice invoice = new Invoice(); 
       JSONObject inv = jsonArray.getJSONObject(i); 

       String companyNameOne = inv.getString("companyNameOne"); 
       String companyNameTwo = inv.getString("companyNameTwo"); 
       String address = inv.getString("address"); 
       String postalCode = inv.getString("postalCode"); 
       String city = inv.getString("city"); 
       String oib = inv.getString("oib"); 
       String email = inv.getString("email"); 
       int comple = inv.getInt("completed"); 
       String completed = String.valueOf(comple); 
       String workOrderNumber = inv.getString("workOrderNumber"); 
       String price = inv.getString("price"); 

       System.out.println("Company Name 1: " + companyNameOne + " Company Name 2: " + companyNameTwo + " address: " + address + " postalCode: " + postalCode + " city: " + city + " oib: " + oib + " email: " + email + " completed: " + completed + " work order num: " + workOrderNumber + " price: " + price); 

       invoice.setCompanyNameOne(companyNameOne); 
       invoice.setCompanyNameTwo(companyNameTwo); 
       invoice.setAddress(address); 
       invoice.setPostalCode(postalCode); 
       invoice.setCity(city); 
       invoice.setOib(oib); 
       invoice.setEmail(email); 
       invoice.setCompleted(completed); 
       invoice.setWorkOrderNumber(workOrderNumber); 
       invoice.setPrice(price); 

       invoices.add(invoice); 
      } 
      return response; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

2. EDIT:

Ich habe es. Entschuldigung, dieses Problem, das Daten nach dem Beheben des Fehlers nicht zeigt, war mein Fehler. In diesem Teil:

JSONObject inv = jsonArray.getJSONObject(i); 

       String companyNameOne = inv.getString("companyNameOne"); 
       String companyNameTwo = inv.getString("companyNameTwo"); 
       String address = inv.getString("address"); 
       String postalCode = inv.getString("postalCode"); 
       String city = inv.getString("city"); 
       String oib = inv.getString("oib"); 
       String email = inv.getString("email"); 
       int comple = inv.getInt("completed"); 
       String completed = String.valueOf(comple); 
       String workOrderNumber = inv.getString("workOrderNumber"); 
       String price = inv.getString("price"); 

diese Strings in (“„) hatte alle Kleinbuchstaben sein, weil ich sie auf diese Weise in meinem PHP geschrieben.

Vielen Dank für Ihre Hilfe.

+0

Wo haben Sie ein Rechnungen Objekt initialisieren? –

+0

@Alex Nik Beim Start, oben onCreate-Methode – Mystiq

+0

onStart Aufruf nach onCreate-Methode. Sie sollten die Sammlung initialisieren, bevor Sie sie an den Adapter übergeben. –

Antwort

1

sollten Sie setzen die Daten durch Adapter zur Listenansicht auf der OnPostExecute() von machen die asyncTask. (https://developer.android.com/reference/android/os/AsyncTask.html)

Da die Aufgabe asynchron ist, versuchen Sie, auf die Daten der Rechnungsliste zuzugreifen, bevor die Antwort vom Server eingetroffen ist.

+0

Ich markierte diese Antwort als am nächsten zu meiner Lösung, aber alle hier angegebenen Antworten waren ähnlich, und für mich sind ALLE richtig. Danke nochmal an heisen, @trocchietto und Alex Nik. – Mystiq

1

Möglicherweise erhalten Sie keine Antwort vom Server, und das ist der Grund, warum die Liste null ist, Bearbeiten der Buchung der StackTrace und können Sie besser helfen, werfen Sie einen Blick auf diese post es sieht das gleiche Problem Sie hatte und der Grund ist in dem Aufruf an den Web-Service (SQL db) Meine Vermutung ist, dass die zweite Zeile des Stacktrace ArrayAdapter.getCount() sagt, weil in der Regel hier das Problem ist, die Methode von ArrayAdapter aufgerufen, die eine Liste zurückgibt , dass in Ihrem Fall Null ist, weil nicht vom Server abgerufen wird. vielleicht eine JsonException, also sollten Sie eine Ausnahme mit einem try catch hinzufügen, um zu verwalten, was passiert, wenn der Server die Antwort nicht abruft.

public int getCount() { 


    return mObjects.size(); 

} 

Async Aufgabe ist weniger genutzt als vor 3 Jahren, die fast alle die Gemeinde jetzt Retrofit verwendet asyncrous Anrufe und auch RXJava

1

Sie übergeben nicht initialisierte Sammlung (null) in Adapter.Deshalb erhalten Sie NullPointerException, wenn der Adapter versucht, die Größe der Sammlung zu ermitteln. Sie müssen dies tun:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.invoice_list); 
    ... 
    invoices = new ArrayList<>(); 
    ArrayAdapter<Invoice> adapter = new ArrayAdapter<Invoice>(this, android.R.layout.simple_list_item_1, invoices); 
    listView1.setAdapter(adapter); 
} 

und dann Sammlung mit neuen Produkten in onPostExecute von AsyncTask bevölkern und rufen adapter.notifyDataSetChanged

+0

Ich habe es repariert, wie Sie alle vorgeschlagen, nicht gibt es keinen Fehler, es öffnet sich in Ordnung, aber es zeigt immer noch keine Daten aus der Datenbank – Mystiq

Verwandte Themen