#android #android-activity #android-asynctask
#Android #android-активность #android-asynctask
Вопрос:
Я использую http get для подключения к сайту и извлечения с него некоторых данных. Для этой цели мне нужно было определить asyncTask
методы и с помощью метода AsyncTask get получить результат, сгенерированный в doInBackground
методе.
Мои вспомогательные методы для получения данных с сервера отлично работают, поэтому нет необходимости публиковать их здесь. Когда я вызываю new LongOperation().execute().get()
, происходит сбой приложения. Когда я отлаживаю код, он открывает новое окно и отображает Source not Found
.
Вот мой код:
Main activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_job_notification);
try {
ArrayList<Job> JobsStore = new LongOperation().execute().get();
} catch (Exception e) {
// TODO: handle exception
}
...
asyncTask Methods
:
public class LongOperation extends AsyncTask<Void, Void, ArrayList<Job>> {
private final static String USER_AGENT = "Mozilla/5.0";
protected ArrayList<Job> doInBackground(String... params) {
ArrayList<Job> JobsStore = SendRSSFeed();
return JobsStore;
}
@Override
protected void onPostExecute(ArrayList<Job> result) {
super.onPostExecute(result);
}
...
Что я здесь делаю не так?
Спасибо.
Комментарии:
1. Отправьте logcat, пожалуйста. Возможно,
ArrayList<Job> JobsStore = SendRSSFeed();
строка выдает исключение с нулевым указателем.2. не используйте,
get()
потому что пользовательский интерфейс зависает, вместо этого используйтеonPostExecute
и работайте с данными на этом3. Разве это не должно быть
ArrayList<Job> JobsStore = new LongOperation().get();
?4. использование get() сводит на нет цель asynctask. Его использование крайне не рекомендуется.
Ответ №1:
При использовании LongOperation().execute().get()
, execute()
запускается асинхронная задача и возвращает экземпляр самого себя. Запуск get()
на этом возвращенном экземпляре снова запускает асинхронную задачу, что, похоже, не имеет смысла.
Так что вы можете использовать LongOperation().get();
.
Смотрите http://developer.android.com/reference/android/os/AsyncTask.html#get () для получения более подробной информации.
Ответ №2:
Разобрался. Проблема заключалась в объявлении метода doInBackground. Параметр должен быть установлен на Void... params
вместо String... params
, потому что я вызывал этот метод с нулевыми параметрами.
Комментарии:
1. Вы не должны использовать
get()
, это синхронно. Это приведет к зависанию пользовательского интерфейсаThread
и сводит на нет цель использованияAsyncTask
.2. Использование
doInBackground(String... params)
withAsyncTask<Void,Void,ArrayList<Job>>
показало бы ошибку в самой IDE, потому что типы параметров не совпадают. Я удивлен, что вы вообще смогли запустить приложение с этой проблемой.