从AsyncTaskLoader更新进度条?

War*_*zit 16 android asynctaskloader progress-bar

使用AsyncTaskLoader时,如何更新显示正在更新状态的进度条?通常你等待回调完成后删除,但是如何运行更新?您是否让主线程(ui)在设置数据时轮询数据?

编辑:我在谈论AsyncTaskLoader,看看加载器部分.这是类的链接:http://developer.android.com/reference/android/content/AsyncTaskLoader.html

我想用它,因为它的未来:),我知道如何用AsyncTask做到这一点.

Sni*_*las 4

您可以使用加载器来做到这一点,但您需要保留并更新 Activity 上的 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) {

    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。Loader 仅在您第一次调用 initLoader 时创建,因此,如果您轮换活动,您将失去对它的引用以及任何进度。处理此问题的正确方法是在加载器上使用 setActivity(...) 方法,该方法更改对新活动的弱引用并使用 getSupportLoaderManager().getLoader(&lt;id&gt;),将其转换为加载器,检查它非 null 并在再次调用 initLoader() 之前对其调用 setActivity() 方法。另外,在 setActivity() 中,您应该确保加载程序将其状态与进度视图同步。 (3认同)
  • 我认为大多数遇到这个问题的人都使用 AsyncTaskLoader 从网络读取一些数据。在这种情况下,请看看 RoboSpice :在网络方面,它比加载程序更接近您的需求:https://github.com/octo-online/robospice (2认同)