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() 即可。
我正在尝试创建一个 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() 即可。