2014-02-12 3 views
1

Я отредактировал это сообщение, просто чтобы добавить на кнопку ответ.(SOLVED) Как продолжить процесс в другом классе после завершения AsyncTask

Я работаю над проектом, и у меня есть вопрос об AsyncTask. Что я пытаюсь сделать, так это отделить AsyncTask от моих классов, написав один раз и вызвать его из любого класса. Итак, я создал класс с именем A, который является активностью фрагмента и содержит представление списка. В этом классе я создаю объект AsyncTask для получения данных из xml и создания списка с этими данными. Когда закончен AsyncTask, я хочу отправить этот список обратно в класс A и продолжить процесс, добавив список в список и обновив макет. Что мне нужно сделать в onPostExecute для прохождения данных в классе A и как я могу сделать класс узнающим о процессе AsyncTask, чтобы он продолжался? Спасибо

Вот мой код, в котором я создаю объект AsyncTask.

GetXMLData load = new GetXMLData(); 
if (this.count == 1) 
{ 
    load.Set_URL(XML_URL); 
    this.count++; 
} 
else 
{ 
    load.Set_URL(XML_URL, "?paged=" + this.count); 
    this.count++; 
} 
LinkedList<Contents> content_list; 
load.start_LoadContents(); 
this.list = new ArrayList<Contents>(); 
content_list = load.get_XML_List(); 
Log.i("content_list", "The content_list is " + content_list.size()); 

Решение: Это второй ответ https://stackoverflow.com/a/21728038/1739677

+1

вы можете использовать широковещательный приемник, отправлять трансляцию после окончания 'AsyncTask' –

ответ

2

Вы можете попробовать это

public class MainActivity extends Activity implements TaskListener { 

TaskListener listener; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    listener = this; 
    new BackgroundTask(listener).execute(""); 

} 

@Override 
public void taskComplete(ArrayList<String> list) { 
    if (list.size() != 0) { 
     Log.i("Log", "list " + list.get(0)); 
    } 
} 

} 

TaskListener.java

public interface TaskListener { 
    public void taskComplete(ArrayList<String> list); 
} 

BackgroundTask.java

public class BackgroundTask extends AsyncTask<String, String, String> { 

TaskListener listner; 
ArrayList<String> list = new ArrayList<String>(); 

public BackgroundTask(TaskListener l) { 
    this.listner = l; 
} 

@Override 
protected String doInBackground(String... params) { 
    // do your background task like below 
    list.add("Android"); 
    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 

    listner.taskComplete(list); 

} 

} 
0

Звучит так, как будто его можно решить с помощью шаблона Observer.

public class BackgroundTask extends AsyncTask<String, String, String> implements MySubjectInterface { 

List<Observer> observerl = new ArrayList<Observer>(); 
ArrayList<String> list = new ArrayList<String>(); 

@Override 
protected String doInBackground(String... params) { 
    // do your background task like below 
    list.add("Android"); 
    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    notifyObservers(); 

} 

/** 
* Observer pattern, this allows to register for changes. 
*/ 
@Override 
public void register(Observer obj) { 
    if (obj == null) 
     throw new NullPointerException("Null Observer"); 
    if (!observerl.contains(obj)) 
     observerl.add(obj); 
} 

/** 
* Observer pattern, this allows to unregister for changes. 
*/ 
@Override 
public void unregister(Observer obj) { 
    observerl.remove(obj); 
} 

/** 
* Notifies the observers. 
*/ 
@Override 
public synchronized void notifyObservers() { 
    for (Observer obj : observerl) 
     obj.update(); 
} 

} 

Тогда вы можете зарегистрировать свою деятельность, которая будет выполнять ваш наблюдатель в Asynctask.

http://en.wikipedia.org/wiki/Observer_pattern

Во всяком случае из моего собственного опыта, это проще всего решить, сделав класс, который контролирует все данные. Он должен показывать «старые» данные из вашего sqllite или некоторую информацию, которую вы проанализировали ранее, и показать, что при создании. Это решит проблемы в будущем, если файл xml не найден или если нет подключения к Интернету. Приложение все еще можно использовать, но просто не с новейшими данными (которые вы должны уведомить пользователя). Затем, когда отображается представление, новые данные принимаются в фоновом режиме, загружаются/анализируются и сохраняются в вашем классе, который содержит информацию. Затем вы отправляете уведомление о своей активности, чтобы новые данные были готовы к отображению, например, в ListView. И, разумеется, здесь важно, чтобы наблюдательный паттерн с ослабленным сцеплением.

Таким образом ваше приложение не ждет длительных операций (веб-запросы, разбор xml/json).

Смежные вопросы