0

在我的活动中,我需要运行两个后台服务。

主要后台服务:

class loadingTask extends AsyncTask<Void, Void,Void> {

      @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        pd = ProgressDialog.show(context, "", "Chargement en cours..", true, false);
        super.onPreExecute();
    }


    @Override
    protected void onPostExecute(Void result) {
         // TODO Auto-generated method stub
        super.onPostExecute(result);
        pd.dismiss();
    }

    ...

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        getxml = Util.CallWebService("");
        return null;
    }
}

第二个后台服务。

class mloadingTask extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... urls) {

        SAXHelper sh = null;
        try {
            sh = new SAXHelper(urls[0]);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        sh.parseContent("");
        return "";

    }

    protected void onPostExecute(String s) {
        pd.dismiss();

    }
}

在我的onCreate()方法中,我想调用第一个后​​台,当它完成加载第二个后台服务时启动。我的部分后台服务如下。

AsyncTask<Void, Void,Void> loadTask = new loadingTask().execute();

    if(loadTask.getStatus()==AsyncTask.Status.FINISHED){

         new mloadingTask().execute(getxml);

         System.out.println("getxml: "+getxml);
    }

但是,第二个后台服务似乎没有启动。我也没有打印出来。我想我错过了一步,或者 android 在同一个活动中不允许多个后台服务。请帮忙。

4

2 回答 2

0

顾名思义,AsyncTask 是异步的。您需要在第一个 AsyncTask 的 onPostExecute 中调用您的第二个 AsyncTask

或者

循环并等待 AsyncTask 在您的活动中完成,但这可能需要更多时间,您可能会收到 Application Not Responding 消息。

一旦您调用 execute() 方法,控制权就会转到 loadTask.getStatus() 的下一条语句。由于任务刚刚开始, loadTask.getStatus() 不会返回 FINISH 并且您的第二个任务永远不会被执行。

于 2013-04-03T09:50:58.347 回答
0
AsyncTask<Void, Void,Void> loadTask = new loadingTask().execute();

if(loadTask.getStatus()==AsyncTask.Status.FINISHED){

  new mloadingTask().execute(getxml);

  System.out.println("getxml: "+getxml);
}

if() 块有 99% 的可能性永远不会通过。在检查它是否完成后,您首先执行名为 loadTask 和 RIGHT 的第一个 asyncTask。到那时它实际上完成的可能性很小。

简单的方法:

只使用一个异步任务。您想完成 asyncTask 1 然后触发 asyncTask 2,这与只有一个 asyncTask 执行这两项操作完全相同。

class loadingTask extends AsyncTask<Void, Void,Void> {

      @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        pd = ProgressDialog.show(context, "", "Chargement en cours..", true, false);
        super.onPreExecute();
    }


    @Override
    protected void onPostExecute(Void result) {
         // TODO Auto-generated method stub
        super.onPostExecute(result);
        pd.dismiss();
    }

    ...

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        getxml = Util.CallWebService("");

        SAXHelper sh = null;
        try {
            sh = new SAXHelper(urls[0]);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        sh.parseContent("");
        return null;
    }
}

困难的方法:

我如何解决这种事情是(我们的情况不同,但应该这样做)

使用一种方法创建一个接口。例如:

public interface OnDataChangedListner {
    void dataChanged(Class listener);
}

然后在某个地方(我使用我的存储库类)编写一个方法来添加和删除整体到 OnDataChangedListener 接口列表

private ArrayList<OnDataChangedListner> mOnDataChangedListners;

public void addOnDataChangedListner(OnDataChangedListner onDataChangedListner){
    synchronized (mOnDataChangedListners){
        mOnDataChangedListners.add(onDataChangedListner);
    }
}

public void removeOnDataChangedListner(OnDataChangedListner onyDataChangedListner){
    if (mOnDataChangedListners != null){
        synchronized (mOnDataChangedListners){
            for (Iterator<OnDataChangedListner> it = mOnDataChangedListners.iterator(); it.hasNext();) {
                OnDataChangedListner listener = it.next();
                if (listener .equals(onDataChangedListner))
                    it.remove();
            }
        }
    }
}

这可能是矫枉过正。但是这个示例应该可以帮助您在任务运行时更新 UI。免费额外!:))

使用上面的代码,在您定义添加和删除侦听器方法的同一类中创建一个 onDataChanged() 方法。

在该代码中调用处理程序

// Need handler for callbacks to the UI thread
final static Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mNotifyDataChanged = new Runnable() {
    public void run() {
        if (mOnDataChangedListners != null){
            synchronized (mOnDataChangedListners){
                for (Iterator<OnDataChangedListner> it = mOnDataChangedListners.iterator(); it.hasNext();) {
                    OnDataChangedListner listener = it.next();
                    if (listener  != null)
                        listener.dataChanged(this.getClass());
                    else
                        it.remove();
                }
            }
        }
    }
};

/**
 * will notify registerred delegates on the main (UI) thread
 */
public void notifyDataChanged(){
    mHandler.post(mNotifyDataChanged);
}

好的,所以我最终给出了整个样本。放置此代码的位置取决于您。但是,当您调用 notifyDataChanged() 时,它将触发处理程序,该处理程序又将循环遍历该类的所有当前注册侦听器

然后它将依次调用侦听器的 datachanged 方法。

为了使这一切正常工作,您所要做的就是让一个类实现接口

调用 addOnDataChangedListener(this);

并实现接口中提供的方法。

请注意,这绝对不是最简单的做事方式。我不知道做你想做的最简单的方法是什么。我以前从来没有遇到过这种情况。

但是您可以在已实现的方法中执行第二个任务。应该管用..

于 2013-04-03T10:06:13.597 回答