Как реализовать упражнение для загрузки файла из Интернета - PullRequest
0 голосов
/ 17 декабря 2011

Мое приложение для Android запускается под действием LoadingActivity.Это действие загружает несколько файлов моего веб-сервера.Сначала он проверяет метку времени в текстовом файле на моем сервере и проверяет, является ли эта метка новее, чем метка, хранящаяся на устройстве.Если это так, он загружает содержимое другого файла на мой веб-сервер и сохраняет его в файл на устройстве.Когда все это будет сделано, я хотел бы перейти к другому занятию, MainActivity.Я делаю все это в методе onWindowFocusChanged следующим образом:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    URL urlUpdated = null;
    BufferedReader in = null;
    try {
        urlUpdated = new URL("http://someurl.com/timestamp.txt");
        in = new BufferedReader(new InputStreamReader(urlUpdated.openStream()));

        String updated = "";
        String inputLine;

        while ((inputLine = in.readLine()) != null)
            updated = updated + inputLine;
        in.close();

        SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        String lastUpdated = preferences.getString("lastUpdated", "");

        if (!lastUpdated.equals(updated)) {
            // Download JSON file (schedule)
            String schedule = "";
            URL urlSchedule;
            urlSchedule = new URL("http://someurl.com/downloadMe.txt");
            in = new BufferedReader(new InputStreamReader(urlSchedule.openStream()));
            while ((inputLine = in.readLine()) != null)
                schedule = schedule + inputLine;
            Log.d(LOG_TAG, schedule);

            // Write schedule to file
            String PATH = "/data/data/com.codeinacup.NibeFestival/";    
            File file = new File(PATH + "Schedule.json");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            OutputStreamWriter writer = new OutputStreamWriter(fileOutputStream);
            writer.write(schedule);
            writer.close();
            fileOutputStream.close();

            // Update last updated preference
            editor.putString("lastUpdated", updated);
            editor.commit();
        }
    }
    catch (MalformedURLException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    // Go to next MainActivity
    Intent scheduleIntent = new Intent(this, MainActivity.class);
    startActivity(scheduleIntent);
}

Моя проблема в том, что при этом мои LoadingActivity будут отображаться, но снова исчезают очень быстро экран станет черным на пару секунд, а затем появится MainActivity.Затем, когда пользователь нажмет кнопку «Назад», он снова вернется к MainActivity.Я обнаружил очевидным, что кнопка «Назад» должна вернуться к LoadingActivity.

Итак, мой вопрос: как мне правильно реализовать действие для загрузки?Моя идея загрузки деятельности:

  • Отображается при запуске приложения
  • Загрузка файлов
  • Переход к следующему действию, MainActivity
  • Если при MainActivity и нажатии кнопки назад, приложение должно выйти

Ответы [ 3 ]

1 голос
/ 17 декабря 2011

Я думаю, что самое умное, что нужно сделать, это не разделять загрузку во втором упражнении.

Обычно мне нравится делать мой веб-доступ в том же упражнении, но с многопоточностью.Я использую asynctask, чтобы сделать мой веб-доступ.

Создайте асинхронную задачу и запустите ее при запуске вашей основной деятельности.Он будет отображаться при запуске приложения, загрузке файлов, переходе к MainActivity и следовании вашему запросу на кнопку возврата.

Этот документ SDK для Asynctask очень хорош: http://developer.android.com/resources/articles/painless-threading.html он мне помог.

И урок, который действительно прояснил это для меня, был следующим: Ларс Фогель: http://www.vogella.de/articles/AndroidPerformance/article.html

Надеюсь, я помог.

1 голос
/ 17 декабря 2011

onWindowFocusChanged вызывается, когда действие получает или теряет фокус.Итак, вы начинаете свою активность, и она вызывает onWindowFocusChanged, потому что она получает фокус.Когда он завершит загрузку ваших вещей, он запускает MainActivity и снова теряет фокус, но снова выполняет метод.

Я хотел бы создать AsyncTask , который загружает ваши вещи и выполняет задачу вОсновная деятельность.И было бы неплохо, если вы покажете пользователю что-нибудь, чтобы он знал, что приложение что-то загружает. ProgressDialog

Нет необходимости в двух действиях.

Надеюсь, это поможет.С уважением Доминик

0 голосов
/ 21 декабря 2011

вы можете сделать всю эту функцию загрузки файлов в потоке или использовать асинхронную задачу и ты должен позвонить

          this.finsish();
...