Программа зависает при загрузке файла в Android - PullRequest
0 голосов
/ 08 июля 2011

Я получаю MalformedURLexception в следующем коде, и я понятия не имею, что его вызвало.

public void down(String url)
    {     try {
        URL url1 = new URL(url);


        HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);
        urlConnection.connect();   
        File SDCardRoot = Environment.getExternalStorageDirectory();
        //create a new file, specifying the path, and the filename
        //which we want to save the file as.
        File file = new File(SDCardRoot,"somefile.ext");


        FileOutputStream fileOutput = new FileOutputStream(file);

        InputStream inputStream = urlConnection.getInputStream();

        int totalSize = urlConnection.getContentLength();
        int downloadedSize = 0;

        byte[] buffer = new byte[1024];
        int bufferLength = 0; //used to store a temporary size of the buffer

        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {

                fileOutput.write(buffer, 0, bufferLength);
                //add up the size so we know how much is downloaded
                downloadedSize += bufferLength;
                //report progress


        }

        fileOutput.close();


    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();

    }
    }
}

Там написано неизвестный протокол. Связь полностью в порядке, пока не появится читающая часть, до этого код даже печатает файл нужного размера. Также у файла, который я пытаюсь загрузить, есть URL как http://download12.aomethin.com/blaa-blaa Если я пытаюсь добавить www, запрос начинает перенаправлять. Хотя я думаю, что это может быть глупостью, но я также хочу знать, как получить имя этого файла и сохранить файл с этим именем вместо того, который я выбрал.

Редактировать: программа работает сейчас, мне просто нужно знать, как мне получить правильное имя файла. И сделайте это фоновым процессом.

1 Ответ

0 голосов
/ 03 ноября 2012

загрузка в основном потоке не является хорошей практикой; Вы должны реализовать это в новом потоке; потому что во время загрузки основной поток занят загрузкой файла. Если время ожидания будет больше ожидаемого, система выдаст ошибку «Не отвечает».

Для этого вы можете использовать " TaskAsync " или " IntentService " или даже создать новую тему. тем не менее, я предлагаю [ TaskAsync ], поскольку это легко реализовать.

рекомендуется установить имя файла самостоятельно:

public void downloadClicked() {
    InputStream in = null;
    FileOutputStream f = null;      
    try {
        String path ="ftp://administrator:password@131.164.140.118:21/MyShedule.zip";
        String targetFileName = "MyShedule.zip";

        URL u = new URL(path);
        URLConnection c =  u.openConnection();         

        c.setDoOutput(true);
        c.connect();
        String string = Environment.getExternalStorageDirectory().getPath().toString();

        in = c.getInputStream();

        f = new FileOutputStream(new File(string +"/kidsLibrary/"+ targetFileName));

        IOUtils.copy(in, f);

        } catch (MalformedURLException e) {
            Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG)
            .show();            
        } catch (ProtocolException e) {         
            Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG)
            .show();
        } catch (FileNotFoundException e) {        
            Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG)
            .show();
        } catch (IOException e) {           
            Toast.makeText(KidsLibrary.this, e.toString(), Toast.LENGTH_LONG)
            .show();
    } finally {
          IOUtils.closeQuietly(in);
          IOUtils.closeQuietly(f);
        }   
}
...