Индикатор выполнения для передачи файлов на SD - PullRequest
3 голосов
/ 11 февраля 2012

я использую следующий код для загрузки файла из интернета. с помощью этого кода у меня есть диалог прогресса

private void startDownload() {
        String url = tv.getText().toString();
        new DownloadFileAsync().execute(url);
    }

    class DownloadFileAsync extends AsyncTask<String, String, String>  {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        @Override
        protected String doInBackground(String... aurl) {
            int count;

            try {

                URL url = new URL(aurl[0]);
                URLConnection conexion = url.openConnection();
                conexion.connect();

                int lenghtOfFile = conexion.getContentLength();
                Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream(
                        "data/data/com.xxxxxxxx.android/app_p_pic/"
                                + "blabla" 
                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {

                e.printStackTrace(); 

            }
            return null;

        }

        protected void onProgressUpdate(String... progress) {
            Log.d("ANDRO_ASYNC", progress[0]);
            mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }

        @Override
        protected void onPostExecute(String unused) {
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        }


    }
}

Есть ли способ использовать приведенный выше код для передачи файла, скажем, внутренний, чтобы SD сейчас я использую следующий код, но я не смог заставить прогресс работать с индикатором прогресса

protected void ontrans() {
        String title = tv.getText().toString();

        try {

            myInput = new FileInputStream(title);


            File directory = new File(Environment.getExternalStorageDirectory()
                    + "/android_files/data/secure");
            if (!directory.exists()) {
                directory.mkdirs();
            }

            OutputStream myOutput = new FileOutputStream(
                    Environment.getExternalStorageDirectory()
                            + "/android_files/data/secure/" + chosenFile);

            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            myOutput.flush();

            myOutput.close();

            myInput.close();
            Toast.makeText(File_exActivity.this, "file move Succesfully!",
                    Toast.LENGTH_SHORT).show();
            showDialog(11);
        } catch (FileNotFoundException e) {
            Toast.makeText(File_exActivity.this, "no file found!",
                    Toast.LENGTH_LONG).show();

            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            Toast.makeText(File_exActivity.this, "move unsuccesfull!",
                    Toast.LENGTH_LONG).show();

            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

Ответы [ 2 ]

0 голосов
/ 23 октября 2012

О чем нужно подумать: вы можете получить размер исходного файла File.length() и место назначения.Сравнивая их для отображения разницы в индикаторе выполнения.

Метод File .length () возвращает следующее в соответствии с javadoc:

Длина,в байтах файла, обозначенного этим абстрактным путем, или 0L, если файл не существует.Некоторые операционные системы могут возвращать 0L для путей, обозначающих зависящие от системы объекты, такие как устройства или каналы.

0 голосов
/ 12 февраля 2012

Что вам нужно сделать, это создать объект индикатора выполнения (вы можете добавить его в свой макет, если хотите, или создать его программно), а затем обновить его состояние в цикле загрузки. Средства создания индикатора выполнения можно найти здесь: http://developer.android.com/reference/android/widget/ProgressBar.html

...