Android - 在HTTP请求之前刷新ListView

时间:2012-02-11 13:14:47

标签: android listview refresh

@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 个答案:

答案 0 :(得分:1)

代码正常运行

这里出现的问题是应用程序执行一直持续到这里..

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

实际上它可以工作,但你正在调用另一个挂起UI线程的任务,这里是:

res = getFromUrl(res);

它挂起UI线程以自我更新,并在获取数据后 这条线再次执行。

dialogAdapter.notifyDataSetChanged(); // Works?

和ListView已更新。

Solutino:永远不要在UI线程上执行URL请求。使用AsyncTask