代码之家  ›  专栏  ›  技术社区  ›  Florian Walther

AsyncTask-为什么我可以访问doInBackground方法中的布局小部件?

  •  0
  • Florian Walther  · 技术社区  · 7 年前

    据我所知 doInBackground 方法不应有权访问布局视图。那么,为什么下面的代码可以工作呢?如您所见,我访问 ProgressBar 从…起 Doin背景

    private class TestAsyncTask extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... integers) {
            progressBar.setMax(integers[0]);
    
            for (int i = 1; i <= integers[0]; i++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Finished!";
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            progressBar.setProgress(0);
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressBar.setProgress(values[0]);
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark    7 年前

    因为它在小部件代码中检查线程,如果不是UI,则创建Runnable并将其发布到UI线程:

    private synchronized void refreshProgress(int id, int progress, boolean fromUser,
                boolean animate) {
            if (mUiThreadId == Thread.currentThread().getId()) {
                doRefreshProgress(id, progress, fromUser, true, animate);
            } else {
                if (mRefreshProgressRunnable == null) {
                    mRefreshProgressRunnable = new RefreshProgressRunnable();
                }
                final RefreshData rd = RefreshData.obtain(id, progress, fromUser, animate);
                mRefreshData.add(rd);
                if (mAttached && !mRefreshIsPosted) {
                    post(mRefreshProgressRunnable);
                    mRefreshIsPosted = true;
                }
            }
        }
    

    RefreshProgressRunnable :导致将Runnable添加到消息队列。runnable将在用户界面线程上运行。