我有后台任务,我想在运行时显示一个确定水平进度条。我希望用户能够看到该过程的实际进度,因此我无法使用不确定的进度条。
以下是我想要显示进度的后台任务:
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。做出任何进展我显示无用。
有没有办法可以获得流程的进度并为它显示一个确定水平进度条?
答案 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;
}
};