大家都了解的子线程不能更新UI,所以普通青年比方我,遇到耗时操作用到线程时。不得不立刻想到了用handler传递来解决UI更细的问题。
普通青年的做法:
方案:使用Thread+handler方式,handler传递信息实现Ui的更新
new Thread( new Runnable() { public void run() { Message message = new Message(); message.what = 1; handler.sendMessage(message); } }).start();
Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: myBounceView.invalidate(); break; } super.handleMessage(msg); } };逼格稍高的普通青年做法:
使用java.util.Timer, java.util.TimerTask, android.os.Handler组合,实现定时的更新UI
private Handler handler = new Handler(); private Runnable myRunnable= new Runnable() { public void run() { if (run) { handler.postDelayed(this, 1000); count++; } tvCounter.setText("Count: " + count); } };或者handler.postDelayed(runable,1000);
写道这里有必要提一下。handler.postDelay尽管看起来是子线程的形式,但事实上质上不是工作在子线程,仅仅是以子线程的形式执行罢了。这也相同呼应了开头说的那句话:UI更新必须在主线程进行。
暂且叫做文艺青年的更新UI做法:
runOnUiThread
new Thread(new Runnable() { @Override public void run() { final String avatarUrl = ((DemoHXSDKHelper)HXSDKHelper.getInstance()).getUserProfileManager().uploadUserAvatar(data); runOnUiThread(new Runnable() { @Override public void run() { dialog.dismiss(); if (avatarUrl != null) { Toast.makeText(UserProfileActivity.this, getString(com.boyuyun.chatui.R.string.toast_updatephoto_success), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(UserProfileActivity.this, getString(com.boyuyun.chatui.R.string.toast_updatephoto_fail), Toast.LENGTH_SHORT).show(); } } }); } }).start();
这是使用demo里的一段代码,也就是他让我開始关注runOnUIThread,该方法是activity的方法,使用是注意指明context。以子线程的形式执行在主线程,从而实现UI更新