简体   繁体   中英

Android app freezes irregularly when downloading files

I'm making an Android app where the user can download files from a FTP-server. For the ftp parts I am using apache.org.commons-net package.

When I have connected to server I get a list of the filenames, and then I want to download each file. I start the download routine which runs in a thread of it's own.

The problem I'm experiencing is, that if I have say 6 files on the server, and I run this code on my emulator, it will download the first two files, and then just freeze (with the progressbar hanging on 34 %). When I run it on my phone it will download three files and freeze.

If I debug my way through the code on the emulator it will download all six files just fine and not freeze.

Does anyone have any idea what might be the problem?

Thanks in advance, LordJesus

This is my code (the client is already initialized):

private void downloadFiles2() {
    dialog = new ProgressDialog(this);
    dialog.setCancelable(true);
    dialog.setMessage("Loading...");
    // set the progress to be horizontal
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    // reset the bar to the default value of 0
    dialog.setProgress(0);
    dialog.setMax(DownloadCount);
    // display the progressbar
    dialog.show();

    // create a thread for updating the progress bar
    Thread background = new Thread (new Runnable() {
        public void run() {
            InputStream is = null; 
            try {
                for (String filename : fileNames) {
                    is = client.retrieveFileStream(filename); 
                    byte[] data = new byte[1024];
                    int x = 0;
                    x = is.read(data, 0, 1024);
                    boolean downloadIsNewer = true;
                    File fullPath = new File(path + "/" + filename); 
                    Log.d("FTP", "Starting on " + filename);
                    if (fullPath.exists()) {
                        downloadIsNewer = checkIfNewer(data, fullPath);
                    }

                    if (downloadIsNewer) {
                        Log.d("FTP", "Need to download new file");
                        FileOutputStream fos = new FileOutputStream(fullPath);
                        fos.write(data,0,x); 
                        while((x=is.read(data,0,1024))>=0){
                            fos.write(data,0,x); 
                        }
                        fileText += filename + " - downloaded OK." + FileParser.newline;
                        is.close();
                        client.completePendingCommand();
                        fos.flush();
                        fos.close();                        
                    }
                    else {
                        Log.d("FTP", "No need to download");
                        is.close();
                        fileText += filename + " - own copy is newer." + FileParser.newline;
                    }
                    // active the update handler
                    progressHandler.sendMessage(progressHandler.obtainMessage());
                }
                client.logout();
                client.disconnect();
            }

            catch (Exception e) {
                // if something fails do something smart
            }
        }
    });
    // start the background thread
    background.start();
}

Handler progressHandler = new Handler() {  
    public void handleMessage(Message msg) {
        dialog.incrementProgressBy(1);
        InfoTextView.setText(fileText);
        if(dialog.getProgress()== dialog.getMax())
        {

            dialog.dismiss();
        }
    }
};

OK, found the problem:

When the boolean downloadIsNewer is false I do not call client.completePendingCommand(). When I add that before the line is.close() it works like a charm.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM