我正在尝试创建一个UI处理程序来刷新gridview,我执行parseURL ASyncTask类并将一个Arraylist返回到MainActivity以在gridview上打印出来。
我编译并运行的代码没有任何错误,但单击按钮后gridview不会刷新。在调试器中,它显示parseURL类成功返回列表,并且处理程序消息的what
值为1.但是处理程序似乎不起作用。
主要活动类
private final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == 1) {
List<String> list = (List) msg.obj;
updateUI(list);
}
}
}
public void onButtonClick(View v) {
EditText text = (EditText)findViewById(R.id.editText1);
String id = text.getText().toString();
new parseURL() {
@Override
protected void onPostExecute(List<String> list) {
handler.obtainMessage(1, list);
}
}
}
private void updateUI(List<String> list) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
GridView grid = (GridView)findViewById(R.id.gridView1);
grid.setAdapter(adapter);
adapter.notifyDataSetChanged();
//grid.invalidateViews();
}
答案 0 :(得分:2)
试试这段代码。
private final Handler handler = new Handler();
public void onButtonClick(View v) {
EditText text = (EditText)findViewById(R.id.editText1);
String id = text.getText().toString();
new parseURL() {
@Override
protected void onPostExecute(List<String> list) {
handler.post(new Runnable() {
@Override
public void run() {
updateUI(list);
}
})
}
}
}
或者
private final Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == 1) {
List<String> list = (List) msg.obj;
updateUI(list);
}
}
}
public void onButtonClick(View v) {
EditText text = (EditText)findViewById(R.id.editText1);
String id = text.getText().toString();
new parseURL() {
@Override
protected void onPostExecute(List<String> list) {
handler.obtainMessage(1, list).sendToTarget();
}
}
}
如果要使用obtainMessage和handleMessage方法对,则应调用sendToTarget
方法,如此handler.obtainMessage(1, list).sendToTarget()
。 obtainMessage()只返回消息。
public final Message receivedMessage()
在API级别1中添加 从全局消息池返回新消息。比创建和分配新实例更有效。检索到的消息将其处理程序设置为此实例(Message.target == this)。如果您不想要该设施,请改为调用Message.obtain()。