抱歉,我不知道问题的标题应该是什么。谁能告诉我这怎么可能?


绿线尚未执行。

编辑:在这里,tmp和size肯定是正整数。

编辑:源代码:

public class MyDownloadService extends IntentService {
String urlD, name, sole, urlOfImage = "";
Context conte;
static int q = -1;
int progress = 0, nin, tmp = 0;
File file;
public static final String NOTIFICATION = "com.example.downloader2.ShowDownloadsActivity";
public static final String NOTIFICATION2 = "com.example.downloader2.ShowDownloadsActivity2";
AppGlobal apg;

public MyDownloadService(String name) {
    super("Downloading");
}

public MyDownloadService() {
    super("Downloading");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    q = q + 1;
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
    super.onCreate();
    conte = this;
}

@Override
protected void onHandleIntent(Intent intent) {
    apg = (AppGlobal) getApplication();
    urlD = intent.getExtras().getString("url");
    name = intent.getExtras().getString("name");
    nin = intent.getExtras().getInt("nin");
    urlOfImage = intent.getExtras().getString("urlOfImage");
    int ret = intent.getExtras().getInt("retry");
    if (ret == 1) {
        Toast.makeText(conte,
                "Please wait... Your download will start soon",
                Toast.LENGTH_SHORT).show();
    }
    sole = name;
    try {
        int size = 0;
        final int TIMEOUT_CONNECTION = 15000;// 15sec
        final int TIMEOUT_SOCKET = 30000;// 30sec
        String imageURL = urlD;
        URL url = new URL(imageURL);
        long startTime = System.currentTimeMillis();
        Log.e("Note: ", "image download beginning: " + imageURL);
        // Open a connection to that URL.
        URLConnection ucon = url.openConnection();

        // this timeout affects how long it takes for the app to realize
        // there's a connection problem
        ucon.setReadTimeout(TIMEOUT_CONNECTION);
        ucon.setConnectTimeout(TIMEOUT_SOCKET);

        // Define InputStreams to read from the URLConnection.
        // uses 3KB download buffer
        InputStream is = ucon.getInputStream();
        size = ucon.getContentLength();
        BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
        File wallpaperDirectory = new File(
                Environment.getExternalStorageDirectory() + "/myFold");
        wallpaperDirectory.mkdirs();
        // sole = sole.replace("?", "_");
        // sole = sole.replace("|", "_");
        // sole = sole.replace("/", "_");
        // sole = sole.replace(":", "_");
        // sole = sole.replace("$", "_");
        file = new File(wallpaperDirectory + File.separator + sole);
        if (file.exists()) {
            file.delete();
        }

        file.createNewFile();
        apg.setInDownload(true);
        FileOutputStream outStream = new FileOutputStream(file);
        byte[] buff = new byte[5 * 1024];

        // Read bytes (and store them) until there is nothing more to
        // read(-1)
        int len;
        tmp = 0;
        while ((len = inStream.read(buff)) != -1) {
            if (apg.getCont()) {
                apg.setCont(false);
                stopSelf();
                Intent inten = new Intent();
                inten.putExtra("urlToDownload", urlD);
                inten.putExtra("timeout", 7);
                inten.putExtra("name", sole);
                inten.putExtra("progress", progress);
                inten.putExtra("nin", nin);
                inten.putExtra("url", urlD);
                inten.setAction("com.example.downloader2.BR");
                sendBroadcast(inten);
                Intent in2 = new Intent(NOTIFICATION);
                in2.putExtra("progress", progress);
                in2.putExtra("running", 0);
                in2.putExtra("name", sole);
                q--;
                sendBroadcast(in2);
                progress = 0;
                if (file.exists()) {
                    file.delete();
                }
                outStream.close();
                return;
            }
            tmp = tmp + len;
            progress = (tmp * 100) / size;
            if(progress<0)
                progress=-1*progress;
            outStream.write(buff, 0, len);
            publishP();
        }
        tmp = size;
        progress = 101;
        publishP();
        // clean up

        outStream.flush();
        outStream.close();
        inStream.close();
        Log.e("Note: ",
                "Download completed in "
                        + ((System.currentTimeMillis() - startTime) / 1000)
                        + " secs.");
    } catch (Exception e) {
        if (file.exists()) {
            file.delete();
        }
        apg.setInDownload(false);
        Intent inten = new Intent();
        inten.putExtra("urlToDownload", urlD);
        if (e.toString()
                .equals("java.io.IOException: open failed: EACCES (Permission denied)")) {
            inten.putExtra("timeout", 5);
        } else {
            inten.putExtra("timeout", 1);
        }
        inten.putExtra("name", sole);
        inten.putExtra("progress", progress);
        inten.putExtra("nin", nin);
        inten.putExtra("url", urlD);
        inten.setAction("com.example.downloader2.BR");
        sendBroadcast(inten);
        Intent in2 = new Intent(NOTIFICATION);
        in2.putExtra("progress", progress);
        in2.putExtra("running", 0);
        in2.putExtra("name", sole);
        q--;
        sendBroadcast(in2);
        progress = 0;
        Log.e("Error: ", "Error is:" + e.toString());
    }
}

protected void publishP() {
    try {
        Intent intent = new Intent();
        intent.putExtra("timeout", 0);
        intent.putExtra("progress", progress);
        intent.putExtra("nin", nin);
        intent.putExtra("name", sole);
        intent.setAction("com.example.downloader2.BR");
        sendBroadcast(intent);
        Intent in2 = new Intent(NOTIFICATION);
        if (progress > 100)
            q--;
        in2.putExtra("progress", progress);
        in2.putExtra("running", 1);
        in2.putExtra("name", sole);
        in2.putExtra("queue", q);
        sendBroadcast(in2);
    } catch (Exception e) {
        Log.e("Shit", e.toString());
    }
}

@Override
public boolean stopService(Intent name) {
    return super.stopService(name);
}
}


编辑:这3个快照是我在相同调试器状态下拍摄的:

最佳答案

这称为溢出。如果数字太大,则无法正确表示,然后变为负数。在术语“溢出”中搜索详细信息。

您可以尝试使用(float)tmp / size * 100,其基本原理是确保计算期间数字不超过100。

请注意,必须进行浮点转换,因为整数除法将始终为您提供整数。在您的情况下,如果不进行强制转换,则总会得到0。

关于android - 正值变为负值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19947249/

10-12 02:40