我正在开发一个项目,我有一个关于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());
答案 0 :(得分: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);
}
}
答案 1 :(得分: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();
}
}
然后,您可以将实现Observer的Activity注册到Asynctask。
http://en.wikipedia.org/wiki/Observer_pattern
无论如何,根据我自己的经验,通过创建一个控制所有数据的类,这是最容易解决的。它应显示sqllite中的“旧”数据或您之前解析的某些信息,并在创建时显示。这将解决将来找不到xml文件或者没有连接到Internet时的问题。该应用程序仍然可以使用,但不能使用最新的数据(您应该通知用户)。然后,当显示视图时,在后台接收新数据并加载/解析并保存在包含信息的类中。然后,您向活动发送通知,告知新数据已准备好显示在例如ListView中。而对于松散耦合观察者模式而言,这一点很重要。
这样你的应用程序就不会等待长时间的操作(Web请求,解析xml / json)。