在AsyncTask完成后如何在另一个类中继续该过程

时间:2014-02-12 12:12:25

标签: android android-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());

2 个答案:

答案 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)。