Android 刷新 GUI 的处理程序

Android Handler to refresh GUI

我正在尝试创建一个 UI 处理程序来在我执行 parseURL ASyncTask class 和 return 一个返回 MainActivity 的 Arraylist 后刷新 gridview在gridview上打印出来。

我编译的代码 运行 没有任何错误,但是单击按钮后 gridview 没有刷新。在调试器中,它显示 parseURL class 成功地 returning 列表并且处理程序消息的 what 值为 1。但是处理程序似乎不起作用。

主要ActivityClass

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();
}

试试这个代码。

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() 仅 returns 消息。

public final Message obtainMessage ()

已添加到 API 级别 1 Returns 来自全局消息池的新消息。比创建和分配新实例更有效。检索到的消息将其处理程序设置为此实例 (Message.target == this)。如果您不想要该设施,只需调用 Message.obtain() 即可。