@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()之前先添加一行。
请帮忙。
答案 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