非UI线程可以去刷新UI吗(timertask调用progressbar的setProgress的特例)
今天我qq群里面的大漠同学问了这样一个问题,先看看他粘贴的源代码如下:
private synchronized void refreshProgress(int id, int progress, boolean fromTouch) { if (mUiThreadId == Thread.currentThread().getId()) { doRefreshProgress(id, progress, fromTouch); } else { RefreshProgressRunnable r; if (mRefreshProgressRunnable != null) { // Use cached RefreshProgressRunnable if available r = mRefreshProgressRunnable; // Uncache it mRefreshProgressRunnable = null; r.setup(id, progress, fromTouch); } else { // Make a new one r = new RefreshProgressRunnable(id, progress, fromTouch); } post(r); } }
从源代码里面我们可以看到当当前刷新的线程不是主线程的时候,ProgressBar会去自动new一个刷新的线程,所以这和刷新的时候在不在主线程里面调用setProgress方法关系不大,从表面上看似乎是在非UI线程里面去修改了主线程的控件,而实际上并非这样。
- 6楼a215318036昨天 17:18
- 哦哦鹅鹅鹅鹅鹅鹅鹅鹅鹅鹅鹅鹅
- 5楼soso7778昨天 15:20
- 这个可以好好学习一下
- 4楼knighttools昨天 14:10
- Joker前来围观。
- 3楼lxjiang2632昨天 13:09
- 刚哥V5
- 2楼snwrking昨天 13:03
- 以前也对AsyncTask中的onPostExecute()能刷新UI感到奇怪,其实也类似楼主的问题了
- 1楼svrsimon昨天 12:48
- 沈阳斌子 来围观