Update progressbar from AsyncTaskLoader?

前端 未结 6 1795
粉色の甜心
粉色の甜心 2021-01-31 05:30

When using a AsyncTaskLoader how would you update a progressbar showing the status as it is being updated? Normally you wait for the callback to remove when done, but how to do

6条回答
  •  北荒
    北荒 (楼主)
    2021-01-31 06:24

    You can do that with loaders, but you need to keep and update a WeakReference on your Activity :

    public class LoaderTestActivity extends FragmentActivity implements LoaderCallbacks {
        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(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 {
            static WeakReference mActivity;
    
            AsyncTaskCounter(LoaderTestActivity activity) {
                super(activity);
                mActivity = new WeakReference(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 onCreateLoader(int id, Bundle args) {
            AsyncTaskLoader asyncTaskLoader = new AsyncTaskCounter(this);
            asyncTaskLoader.forceLoad();
            return asyncTaskLoader;
        }
    
        @Override
        public void onLoadFinished(Loader arg0, Void arg1) {
    
        }
    
        @Override
        public void onLoaderReset(Loader arg0) {
    
        }
    
    }
    

提交回复
热议问题