Java 为什么我的计算百分比在Android SDK中变为负值?

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

我希望这将是一件我错过的愚蠢的事情,但我一直在用头敲击键盘,试图找出我错在哪里

我正在尝试在新线程中从DownloadManager更新ProgressBar。直到大约一半时,ProgressBar才重新设置到开始位置。通过输入一些调试代码,我将问题隔离到这一行:

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 a
long
并避免强制转换。我同意这个答案,因为在我的例子中,dl_progress用于
ProgressBar.setProgress()
,它使用整数,因此,我很高兴使用+1,并将常量更改为long,这样在将其指定为long之前不会溢出。