Android: заполнение ListView (JSON) на основе выбора из двух счетчиков - PullRequest
0 голосов
/ 27 ноября 2018

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

У меня есть 2 счетчика, заполненные из JSON (значения 2-го счетчика основаны на 1-м).Если я нажму кнопку «Отправить» после выбора значений счетчика, я получу список, загруженный элементами из JSON.

Итак, концепция, которую я предположил, такова:

Я заполнил счетчики, затем, когда я нажимаю "Отправить", значения счетчиков отправляются туда на веб-сервис PHP, я написал SQL-запрос для получения данных на основена этих счетчиках.

Проблема в том, что я не могу получить результат.После нажатия кнопки «Отправить» ошибка отсутствует, но я не могу перейти к просмотру списка.

Вот фрагмент кода, относящийся к моей проблеме.

Веб-сервис PHP:

<?php
.......
.......
....... 

if(isset($_POST['converternumber']) && isset($_POST['zonenumber']))
{

  $n_converternumber = $_POST["converternumber"];
  $n_zonenumber = $_POST["zonenumber"];
//$n_converternumber= "2";

}
$sql_query= "select codeid from addcode where converternumber like '%".$n_converternumber."%' and zonenumber like '%".$n_zonenumber."%'";

$result= mysqli_query($connectionn,$sql_query);
..........
..........
?>

В mainActivity я могу заполнить 2 счетчика, я просто вставляю код метода onClick кнопки отправки:

public void addflrsurvey(View view){

        st = stateSpinner.getSelectedItem().toString();
        ci = citiesSpinner.getSelectedItem().toString();

        String method = "listofcodes";
        BackgroundTaskcode backgroundTaskcode = new BackgroundTaskcode(this);
        backgroundTaskcode.execute(method, st, ci);
        finish();
}

И у класса BackgroundTaskcode есть класс doInBackground следующим образом

 try {
                URL url = new URL(flr_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                OutputStream os = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));

                String data = URLEncoder.encode("converternumber", "UTF-8")+"="+URLEncoder.encode(st,"UTF-8")+"&"+
                        URLEncoder.encode("zonenumber", "UTF-8")+"="+URLEncoder.encode(ci,"UTF-8");
                bufferedWriter.write(data);
                bufferedWriter.flush();
                bufferedWriter.close();
                os.close();
                InputStream IS = httpURLConnection.getInputStream();
                IS.close();

                return "wait....";
.................}

Есть еще один класс Java с именем codelist, в котором есть код для заполнения списка из файла json, который работает нормально, но я хочу, чтобы онбыть основан на выборе значения счетчиков.

Снова я искренне прошу не блокировать меня и не закрывать это.Заранее спасибо

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

11-28 14:58:32.040 3831-3880/com.example.app.spinnerdemo E/Json response: []����������������������������������������������
11-28 14:58:32.065 3831-3881/com.example.app.spinnerdemo E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
    Process: com.example.app.spinnerdemo, PID: 3831
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:309)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:200)
        at android.os.Handler.<init>(Handler.java:114)
        at android.widget.Toast$TN.<init>(Toast.java:345)
        at android.widget.Toast.<init>(Toast.java:101)
        at android.widget.Toast.makeText(Toast.java:259)
        at com.example.app.spinnerdemo.codelist$FetchDataTask.doInBackground(codelist.java:61)
        at com.example.app.spinnerdemo.codelist$FetchDataTask.doInBackground(codelist.java:43)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
        at java.lang.Thread.run(Thread.java:818) 
11-28 14:58:32.338 1664-3178/system_process W/ActivityManager:   Force finishing activity com.example.app.spinnerdemo/.codelist
11-28 14:58:32.393 1664-3178/system_process W/ActivityManager:   Force finishing activity com.example.app.spinnerdemo/.MainActivity

Ссылка на полный КОД

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

У вас проблема с сегментом кода ниже.

BackgroundTaskcode backgroundTaskcode = new BackgroundTaskcode(this);
backgroundTaskcode.execute(method, st, ci);
finish();

Вы finishing Activity сразу после запуска фоновой задачи.Вам следует подождать, пока asyncTask не завершится и не запустит метод onPostExecute.

0 голосов
/ 28 ноября 2018

У вас возникла эта проблема, потому что вы пытаетесь создать Toast, но Toast может отображаться только из потока пользовательского интерфейса / основного потока, а не из фонового потока.Переместить Toast из doInbackground в onPostExecute

...