Асинхронная задача Android с методом get не работает

#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) with AsyncTask<Void,Void,ArrayList<Job>> показало бы ошибку в самой IDE, потому что типы параметров не совпадают. Я удивлен, что вы вообще смогли запустить приложение с этой проблемой.