Получение данных из онлайн-базы данных MySQL в & quot; onCreate & quot; метод деятельности

Я работаю над приложением, которое должно получать данные из онлайн-базы данных MySQL и показывать их в виде списка в макете активности.

Проблема в том, что мое приложение получает ошибку «Попытка вызвать метод интерфейса« int java.util.List.size () »для ссылки на пустой объект»

В методе onCreate я вызываю класс asyncTask для получения данных с сервера, а затем под этой строкой кода я устанавливаю эти данные через адаптер в listview, который является моим макетом.
При запуске этого действия я получаю сообщение об ошибке.

Должен ли я получить данные с сервера перед запуском Activity? Или проблема в другом?
Мой php файл работает нормально, когда я проверяю его в браузере.

Вот метод создания:

@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);
}

РЕДАКТИРОВАТЬ:

Я исправил это, как вы все предложили, теперь нет ошибок, активность открывается, но она по-прежнему не показывает никаких данных из онлайн-базы данных ..
Вот отредактированный метод onCreate ():

@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();
}

и вот класс AsyncTask:

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-е РЕДАКТИРОВАНИЕ:

Я понял. Извините, эта ошибка не показала данные после исправления ошибки. В этой части:

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");

эти строки в («») ВСЕХ должны быть маленькими буквами, потому что я написал их таким образом в моем PHP.

Спасибо за вашу помощь.

1

Решение

Вы должны установить данные через адаптер для просмотра списка в onPostExecute () asyncTask. (https://developer.android.com/reference/android/os/AsyncTask.html)

Поскольку задача асинхронная, вы пытаетесь получить доступ к данным списка счетов до получения ответа от сервера.

1

Другие решения

Возможно, вы не получаете ответ от сервера, и по этой причине список пуст, отредактируйте публикацию трассировки стека и сможете помочь вам лучше, посмотрите на это сообщение похоже, проблема та же, что и у вас, и причина в обращении к веб-службе (SQL db)
Я предполагаю, что вторая строка вашей трассировки стека говорит ArrayAdapter.getCount ()
потому что обычно здесь проблема, метод, вызываемый ArrayAdapter, который возвращает список, который в вашем случае является нулевым, потому что не получает с сервера. может быть, JsonException, поэтому вы должны добавить исключение с помощью команды catch для управления тем, что происходит, если сервер не получает ответ.

 public int   getCount() {return mObjects.size();

}

Асинхронная задача используется меньше, чем 3 года назад, почти все сообщество использует сейчас модифицировать совершать асинхронные звонки, а также RXJava

1

Вы передаете неинициализированную коллекцию (null) в адаптер. Вот почему вы получаете NullPointerException, когда адаптер пытается получить размер коллекции.
Вам нужно сделать это:

@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);
}

а затем заполните коллекцию новыми элементами в onPostExecute из AsyncTask и позвонить adapter.notifyDataSetChanged

1
По вопросам рекламы [email protected]