2013-04-03 43 views
0

在我的活力中,我需要運行兩個後臺服務。兩個後臺服務android

主要後臺服務:

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不允許在同一活動中使用多個後臺服務。請幫忙。

+0

執行loadTask後,您立即檢查它是否完成。如果你做任何需要超過50ms的事情,它將永遠不會通過支票。你應該創建一些回調(接口可以很好地工作) –

+0

你能舉個例子嗎? – yakusha

回答

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); 
} 

然後某處(我用我的倉庫類) 編寫添加和刪除entires到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。免費的額外! :))

通過上面的代碼,在u定義了add和remove listener方法的同一個類中創建一個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(本);

並實現接口中提供的方法。

請注意,這不是執行任務的最簡單方法。 我不知道什麼是最簡單的方法來做你想做的。我從來沒有遇到過這種情況。

但您可以執行已實施方法中的第二個任務。應該工作..

+0

你能幫我在聊天室嗎? – yakusha

+0

我在這裏寫了一個完整的例子..它不是很簡單,但你幾乎可以複製和粘貼它,它應該工作。你曾經與聽衆/接口? –

+0

都能跟得上我在這裏發現的Android – yakusha

0

AsyncTask是異步的,正如其名稱所示。你需要打電話給你第二次的AsyncTask在onPostExecute你的第一的AsyncTask

OR

環路,等到的AsyncTask在您的活動結束,但它可能需要更多的時間,你可以得到應用程序沒有響應的消息。

只要調用execute()方法,控件就會發出下一條語句loadTask.getStatus()。當任務剛剛開始時,loadTask.getStatus()不會返回FINISH,並且第二個任務永遠不會執行。

+0

當我將.execute()放在第一個asynctask的postexcute方法中時,有一個強制關閉(併發錯誤)。這就是爲什麼我試圖找到運行第二個後臺服務的替代方案。 – yakusha

+0

在這種情況下,將你的活動對象(this)傳遞給你的第一個異步任務,並在onPostExecute中調用一個方法,使用活動對象 – Amit

+0

啓動你的第二個AsyncTask你能給我一個例子嗎?或教程 – yakusha