Предотвращение доступа к Интернет-методу от задержки всплывающего окна - PullRequest
1 голос
/ 28 января 2011

Совершенно новый для разработки Android и Java в целом, поэтому прошу прощения за любительское невежество и отсутствие терминологии.

Я работаю над приложением Android, которое включает в себя выборку веб-страниц в виде строк с использованием метода, основанного на коде, доступном по адресу http://www.spartanjava.com/2009/get-a-web-page-programatically-from-android/.

Это занимает небольшое, но заметное количество времени, но работает нормально. Это вызвано нажатием кнопки в пользовательском интерфейсе. Поскольку приложение не отвечает во время выборки данных, у меня есть тост, который должен предупреждать пользователей, прежде чем это произойдет.

Вот, по сути, то, что делается (не сам код, а просто иллюстрация):

public void buttonPressed(View view) 
{
   Toast.makeText(this, "Getting Data!", Toast.LENGTH_LONG).show();

   //See the page linked above for the code in this function!
   String page = getPage("http://www.google.com/");

   Toast.makeText(this, "Data Retrieved!", Toast.LENGTH_LONG).show();
}

К сожалению, тост «Получение данных» появляется только после того, как метод getPage завершен, и появляется очень кратко, прежде чем он будет скрыт тостом «Извлеченные данные».

Как этого избежать, когда появляется тост "Получение данных", затем запускается метод getPage, а затем появляется тост "Полученные данные"?

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

Грег

Ответы [ 2 ]

2 голосов
/ 28 января 2011

правильное использование класса AsyncTask, который решает вашу проблему:

обратите внимание на методы onPreExecute и onPostExecute, которые вызываются до / после получения страницы.

public class HomeActivity extends Activity {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.home);
    }
    public void buttonPressed(View view) {
        new MyAsyncTask(this).execute(new String[] {"http://google.com/"});
    }
    private class MyAsyncTask extends AsyncTask<String, Void, String> {
        private Context context;
        public MyAsyncTask(Context context) {
            this.context = context;
        }
        @Override
        protected String doInBackground(String... params) {
            String page = getPage(params[0]);
                    //do any more work here that may take some time- like loading remote data from a web server, etc
            return page;
        }
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Toast.makeText(context, "Data Retrieved: " + result, Toast.LENGTH_LONG).show();
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast.makeText(context, "Getting Data!", Toast.LENGTH_LONG).show();
        }
    }
}
1 голос
/ 28 января 2011

Вы не должны выполнять длительные (т. Е. Сетевые или дисковые операции ввода-вывода) операции в потоке пользовательского интерфейса.Вы должны использовать комбинацию AsyncTask или Thread / * 1003.

AsyncTask Тема
...