Android - обновить ListView перед HTTP-запросом - PullRequest
1 голос
/ 11 февраля 2012
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    switch (requestCode)
    {
    case REQUEST_VOICE:
        if (resultCode != RESULT_OK) break;
        ArrayList<String> raw = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        dialogAdapter.add(raw.get(0));
        dialogAdapter.notifyDataSetChanged(); // Doesn't work?!
        String res = "http://192.168.0.197/xyz.php?v=1";
        res = getFromUrl(res); // Get content from internet
        if (!res.startsWith("{")) res = "Error.";
        else {
            try {
                JSONObject json = new JSONObject(res);
                dialog.set(dialog.lastIndexOf(raw.get(0)), json.getString("in")); // Should update the row that was added before the call of getFromUrl()
                res = json.getString("out");
            } catch (Exception e) {
                res = "Error";
            }
        }
        dialogAdapter.add(res);
        dialogAdapter.notifyDataSetChanged(); // Works?
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

(я сократил код выше.) ListView (dialogAdapter является адаптером) обновится после полного выполнения функции (onActivityResult), но я хочу добавить к нему строку перед вызовом getFromUrl ().

Пожалуйста, помогите.

1 Ответ

1 голос
/ 11 февраля 2012

Код работает нормально, как и ожидалось

Проблема, которая возникает здесь, заключается в том, что выполнение приложения продолжается до этого момента.

dialogAdapter.add(raw.get(0));
dialogAdapter.notifyDataSetChanged(); // Doesn't work?!

на самом деле оно работает, но вы вызываете другую задачу, котораяВисит поток пользовательского интерфейса, вот он:

res = getFromUrl(res);

Он вешает поток пользовательского интерфейса, чтобы обновить себя, и после того, как данные получены, эта строка выполняется снова.

dialogAdapter.notifyDataSetChanged(); // Works?

и ListViewобновлено.

Solutino: Никогда не выполняйте запрос URL в потоке пользовательского интерфейса.Используйте AsyncTask

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...