使用进度条显示后台任务的实际进度

时间:2014-03-13 05:56:07

标签: android

我有后台任务,我想在运行时显示一个确定水平进度条。我希望用户能够看到该过程的实际进度,因此我无法使用不确定的进度条。

以下是我想要显示进度的后台任务:

  ParseCloud.callFunctionInBackground("invite", params,
            new FunctionCallback<String>() {

                @Override
                public void done(String object, ParseException e) {
                    // TODO Auto-generated method stub
                    Log.i("tag", "user create has run");
                    if (e == null) {

                        Toast.makeText(getActivity(), "successful" + mPhone, Toast.LENGTH_LONG).show();



                    } else {
                        String errorMessage = e.getMessage().toString();
                        Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();



                    }

                }

            });

我考虑过使用AsyncTask,但是这段ParseCloud.callFunctionInBackground代码为自己创建了一个新线程并在其上运行任务。因此,当我在AsyncTask的后台调用它时,当它到达代码的这一部分时,它为任务创建一个新线程,即保留由AsyncTask的doInBackground创建的线程。然后因为在其线程上不再进行任何工作,doInBackground结束并且当任务仍然在它创建的线程上运行时调用onPostExecute。做出任何进展我显示无用。

有没有办法可以获得流程的进度并为它显示一个确定水平进度条?

1 个答案:

答案 0 :(得分:0)

更新:忽略这一点,我想这不会起作用,你需要一个AsyncTask

如果该功能已在后台运行,则您不需要AsyncTask。在您的代码段中,done函数在完成后会被调用,因此它与postExecute的情况相同。如果您有一些中间函数来获取进度,可以使用Looper.getMainLooper()附加回主线程。

另一个选项是使用Looper.myLooper()ParseCloud获取帖子并将其与AsyncTask的帖子一起加入,因此doInBackground没有完成正确程。

更新:这更容易:

您可以简单地使用runOnUiThread(我在新线程中使用runnable来模拟ParseCloud):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextProgress = (TextView) findViewById(R.id.text_progress);

    Button slowButton = (Button) findViewById(R.id.button_slow);
    slowButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mTask.execute((Void[]) null);
        }
    });
}

private void updateUi(int i) {
    mTextProgress.setText(String.valueOf(i));
}


Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 100; i += 10) {
            try {
                final int finalI = i;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        updateUi(finalI);
                    }
                });
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};

private AsyncTask<Void, Integer, Void> mTask = new AsyncTask<Void, Integer, Void>() {

    @Override
    protected void onProgressUpdate(Integer... values) {
        mTextProgress.setText(values[0].toString());
    }

    @Override
    protected Void doInBackground(Void... params) {
        new Thread(mRunnable).run();
        return null;
    }
};