Ошибка Android: уведомить пользователя о том, какой файл загружается - PullRequest
1 голос
/ 05 марта 2012

У меня есть код, который загружает видео с URL. Я использую AsyncTask. Теперь, что я хочу сделать, это уведомить пользователя через диалоговое окно прогресса о том, какое видео загружается, или что-то вроде «Загрузка видео 2 из 10». Я использую следующий код:

//DOWNLOAD VIDEOS
private class downloadVideosAsync extends AsyncTask <String, String, String>{

    protected void onPreExecute(){
        super.onPreExecute();
        MyActivity.this.mProgressDialog.setMessage("Downloading Videos...");
    }

    @Override
    protected String doInBackground(String... strings){
        try{

            ArrayList<String> VideoNames = VideosM.getVideoNames();
            ArrayList<String> VideoUrls = VideosM.getVideoUrls();

            File vidFile = null;
            int videoNamesLenght = VideoNames.size();
            int x;

            for(x = 0; x < videoNamesLenght; x++) {

                //download video
                String[] videoName = VideoNames.get(x).split("/");
                String currentFile = videoName[0] + "." + videoName[1];
                String currentFileURL = VideoUrls.get(x) + VideoNames.get(x);

                vidFile = new File(Environment.getExternalStorageDirectory() 
                                    + "/Engagia/Downloads/Videos/", currentFile);

                if( !vidFile.exists() ){
                    int curr_vid = x + 1;

                    String ui_msg = "Downloading Videos " + curr_vid + " of " + videoNamesLenght + "...";
                    MyActivity.this.mProgressDialog.setMessage( ui_msg );

                    VideosC.downloadVideoFile(currentFile, currentFileURL, vidFile);

                }
            }

        }catch (NullPointerException e){
            Log.e(LOG_TAG, e.toString());
        }catch(Exception e){
            Log.e(LOG_TAG, e.toString());
        }
        return null;
    }

    @Override
    protected void onPostExecute(String lenghtOfFile) {
        new downloadSlideshowsAsync().execute();
    }
}

Приведенный выше код выдает ошибку:

android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.

EDIT:

Я тоже пробовал:

runOnUiThread(new Runnable() {
     public void run() {

        String ui_msg = "Downloading Videos " + curr_vid + " of " + videoNamesLenght + "...";
        Engagia.this.mProgressDialog.setMessage( ui_msg );
        Log.v("VideosController.java", ui_msg );

    }
});

но выдает мне ту же ошибку ...

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

используйте onProgreesUpdate для обновления индикатора выполнения.

найдите подробности на сайте разработчика Android ссылка

2 голосов
/ 05 марта 2012

Только специальный поток, часто называемый «потоком пользовательского интерфейса», может изменять элементы пользовательского интерфейса.Вы можете запустить конкретный код в потоке пользовательского интерфейса, запустив что-то внутри функции runOnUiThread, которая является частью Класс активности .Например:

runOnUiThread(new Runnable() {
    public void run() {
    // ...
    }
});
...