我正在尝试使用this library在AsyncTask的onProgressUpdate()
的“活动”屏幕上发布进度,该屏幕用于从互联网下载一些数据。他们提供的演示应用程序使用Handler
来演示这一点。我需要在AsyncTask中使用它。
以下代码段来自其演示应用程序中的代码。
我的问题是:
onProgressUpdate获取参数Progress... values
,和
根据{{3}},它是“指示的值
进展。“但我不明白这意味着什么,以及如何
使用这个论点。在我看到的例子中,他们正在做
类似的东西:
progressBar.setProgress(Integer.parseInt(values[0]));
为什么他们只在传递的数组中使用第一个值 (值[ 0 ])?
AsyncTask
如何知道完成需要多长时间
下载操作。我想展示ProgressBar的进展
在完成下载所花费的时间内,值为0到100
操作。
通过执行progressBarDeterminate.setVisibility(View.VISIBLE)
onPreExecute
并且正在做
progressBarDeterminate.setVisibility(View.GONE)
in
onPostExecute
,我们确保它只显示数据的时间
正在下载,但我们如何确保它的进展
在所需的时间内开始到最终位置
下载数据 (当我们不确切知道它有多长时间
打算下载数据)?
CODE FROM DEMO示例(它使用Handler,但我需要在AsyncTask中执行此操作)
public class MainActivity extends AppCompatActivity {
ProgressBarDeterminate progressBarDeterminate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBarDeterminate = (ProgressBarDeterminate) findViewById(R.id.progressDeterminate);
progressTimer.start();
}
Thread progressTimer = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i <= 100; i++){
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendMessage(new Message());
}
}
});
Handler handler = new Handler(new Handler.Callback() {
int progress = 0;
@Override
public boolean handleMessage(Message msg) {
progressBarDeterminate.setProgress(progress++);
return false;
}
});
}
答案 0 :(得分:1)
在回答您的第一个问题时,onProgressUpdate
()
会采用 varargs 参数。这意味着它可以使用指定类型的无限数量的参数。例如:
public void someMethod(String... args) {
//...
}
可以像这样调用,someMethod("Hi!")
或此someMethod("Hi", "there", "welcome", "to", "SO")
。
有关 varargs 的更多信息,请here。这些参数的访问方式与数组相同。如果那里只有一个参数,那么你可以使用args[0]
。
修改强> 关于您的第二个问题,Android开发者javadocs中提供了一个很好的示例:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
即答案真的取决于你的情况。在上面的例子中说你需要下载十个URL。设置for
循环以按顺序下载每个URL
,并且在URL
完成后,调用publishProgress()
,将当前值转换为百分比数字,{ {1}}。希望能回答你的问题!