Java 为什么我的计算百分比在Android SDK中变为负值?
我希望这将是一件我错过的愚蠢的事情,但我一直在用头敲击键盘,试图找出我错在哪里 我正在尝试在新线程中从DownloadManager更新ProgressBar。直到大约一半时,ProgressBar才重新设置到开始位置。通过输入一些调试代码,我将问题隔离到这一行:Java 为什么我的计算百分比在Android SDK中变为负值?,java,android,android-progressbar,integer-overflow,Java,Android,Android Progressbar,Integer Overflow,我希望这将是一件我错过的愚蠢的事情,但我一直在用头敲击键盘,试图找出我错在哪里 我正在尝试在新线程中从DownloadManager更新ProgressBar。直到大约一半时,ProgressBar才重新设置到开始位置。通过输入一些调试代码,我将问题隔离到这一行: final int dl_progress = (bytes_downloaded*100)/bytes_total; dl_进度在文件下载的中途变为负值!相关代码块和日志输出如下: @Override public
final int dl_progress = (bytes_downloaded*100)/bytes_total;
dl_进度
在文件下载的中途变为负值!相关代码块和日志输出如下:
@Override
public void run() {
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
Cursor cursor = manager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
getActivity().runOnUiThread(new Runnable() {
public void run() {
mProgressBar.setVisibility(View.INVISIBLE);
}
});
}
final int dl_progress = (bytes_downloaded*100)/bytes_total;
Log.d("Download", bytes_downloaded + " of " + bytes_total + " (" + dl_progress + "%)");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress((int) dl_progress);
}
});
cursor.close();
}
}
下面是调试:
D/Download(18228): 7614 of 38577287 (0%)
D/Download(18228): 4226950 of 38577287 (10%)
D/Download(18228): 8578734 of 38577287 (22%)
D/Download(18228): 13207130 of 38577287 (34%)
D/Download(18228): 16539590 of 38577287 (42%)
D/Download(18228): 22287422 of 38577287 (-53%)
D/Download(18228): 28363958 of 38577287 (-37%)
D/Download(18228): 32550806 of 38577287 (-26%)
D/Download(18228): 38577287 of 38577287 (-11%)
我肯定是我干了些傻事,但在这种情况下,我看不见树木,有人能解释一下吗
非常感谢。当您将它们乘以100时,您的值超过了整数的最大值。尝试在整数上使用double下载的字节数*100的中间结果溢出了支持的整数范围(>2^31-1),并给出了一个否定结果 您可以使用long并将最终结果转换回int来解决此问题:
final int dl_progress=(int)((下载字节*100L)/总计字节)代码>将dl\u进度
从int
更改为long
溢出,溢出<代码>我回来了。
只需使用长整型值或更改优先级即可。在乘法之前进行除法。在这种情况下,如果使用整数,则可以得到0,因为使用long可能是更好的选择。您可以使dl_progress along
并避免强制转换。我同意这个答案,因为在我的例子中,dl_progress用于ProgressBar.setProgress()
,它使用整数,因此,我很高兴使用+1,并将常量更改为long,这样在将其指定为long之前不会溢出。