Android Handler刷新GUI

时间:2015-02-25 03:58:21

标签: java android android-handler

我正在尝试创建一个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();
}

1 个答案:

答案 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()。