你可以做到這一點與裝載機,但你需要保持和更新的WeakReference你的活動:
public class LoaderTestActivity extends FragmentActivity implements LoaderCallbacks<Void> {
private static final int MAX_COUNT = 100;
private ProgressBar progressBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task_test);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
progressBar.setMax(MAX_COUNT);
AsyncTaskCounter.mActivity = new WeakReference<LoaderTestActivity>(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_async_task_test, menu);
return true;
}
public void onStartButtonClick(View v) {
startWork();
}
void startWork() {
getSupportLoaderManager().initLoader(0, (Bundle) null, this);
}
static class AsyncTaskCounter extends AsyncTaskLoader<Void> {
static WeakReference<LoaderTestActivity> mActivity;
AsyncTaskCounter(LoaderTestActivity activity) {
super(activity);
mActivity = new WeakReference<LoaderTestActivity>(activity);
}
private static final int SLEEP_TIME = 200;
@Override
public Void loadInBackground() {
for (int i = 0; i < MAX_COUNT; i++) {
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(getClass().getSimpleName(), "Progress value is " + i);
Log.d(getClass().getSimpleName(), "getActivity is " + getContext());
Log.d(getClass().getSimpleName(), "this is " + this);
final int progress = i;
if (mActivity.get() != null) {
mActivity.get().runOnUiThread(new Runnable() {
@Override
public void run() {
mActivity.get().progressBar.setProgress(progress);
}
});
}
}
return null;
}
}
@Override
public Loader<Void> onCreateLoader(int id, Bundle args) {
AsyncTaskLoader<Void> asyncTaskLoader = new AsyncTaskCounter(this);
asyncTaskLoader.forceLoad();
return asyncTaskLoader;
}
@Override
public void onLoadFinished(Loader<Void> arg0, Void arg1) {
}
@Override
public void onLoaderReset(Loader<Void> arg0) {
}
}
我認爲大多數遇到此問題的人都使用AsyncTaskLoader從網絡中讀取一些數據。在這種情況下,請查看RoboSpice:在網絡方面,它比裝載程序更接近您的需求:https://github.com/octo-online/robospice – Snicolas 2012-11-08 15:17:57
我們不需要同步'mActivity 「訪問? – 2013-03-22 07:28:55
這是錯誤的。只有在第一次調用initLoader時纔會創建Loader,因此如果您旋轉活動,則失去了對它的引用以及任何進度。 來處理這個正確的方法是有你的加載器setActivity(...)方法,改變弱引用新的活動,並使用getSupportLoaderManager()。getLoader(),將其轉換爲您的裝載機,檢查非空並在再次調用initLoader()之前調用它的setActivity()方法。同樣在setActivity()中,您應該確保加載器將其狀態與進度視圖同步。 –
2014-03-18 16:43:05