Issue
From my understanding, the doInBackground
method should not have access to the layout views. So why does the following code work? As you can see, I access the ProgressBar
from doInBackground
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]);
}
}
Solution
Because in the widget code it checks the thread, if not UI it creates a Runnable and posts it to the UI Thread :
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
: Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.
Answered By - Mark
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.