2015-04-17 32 views
0

我正在獲取用戶在實現LocationListener的服務中的位置。在OnlocationChanged()方法中,我創建了一個asynctask類的實例,該實例將將值上傳到聯機數據庫。問題是,只要偵聽器調用OnlocationChanged()方法,就會創建一個新的asynctask實例,並且會減慢設備速度。我想要一個方法/機制來將asynctask的實例限制爲最多 5.創建有限的AsyncTask實例

回答

0

它與java中的Thread Pools非常相似(here)。

public class MaxAsyncHandler { 

private static MaxAsyncHandler instance = new MaxAsyncHandler(); 
ArrayList<Data> list; 
int count; 
int MAX = 5; 


private MaxAsyncHandler() { 
    this.count = 0; 
    list = new ArrayList<Data>(); 
} 

public int getCount() { return count; } 

public int incCount() { count++; } 

public static MaxAsyncHandler getInstance() 
{ 
    return instance; 
} 

public void createTask(Data data) { 
    if(count < MAX) 
    new AsyncTask(data); // 
    else 
    list.add(data); 
} 

// Call this method when an AsyncTask finishes 
public void checkPool() { 
    if(list.size() > 0) 
    new AsyncTask(list.get(0)); // 
} 
} 

PS:我使用了單例模式。

0

使用布爾變量isLoading並將其初始化爲false。

在AsynctTask內onPreExcecute使isLoading真實,onPostExecute使isLoading假

現在呼籲的AsyncTask之前,你只需要提出以下條件及其實現。我想這就是你想要的

if(!isLoading) new LongOperation()。execute(「」);

0

您可以從AsyncTask繼承並創建自己的類,然後使用靜態變量來跟蹤實例編號。

public class MyAsyncTask<Params, Progress, Result> extends 
    AsyncTask<Params, Progress, Result> { 

private static int COUNT = 0; 
private static int LIMITATION = 5; 

public MyAsyncTask() { 
    // TODO Auto-generated constructor stub 
    super(); 
    COUNT++; 
    if (COUNT > LIMITATION) { 
     // TODO: 
     // FIXME: 
     throw new RuntimeException("no more than " + LIMITATION 
       + " asyn task"); 
    } 
} 

public static void resetCounter() { 
    COUNT = 0; 
} 

@Override 
protected Result doInBackground(Params... params) { 
    // TODO Auto-generated method stub 
    return null; 
} 

/* 
* (non-Javadoc) 
* 
* @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
*/ 
@Override 
protected void onPostExecute(Result result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
} 

/* 
* (non-Javadoc) 
* 
* @see android.os.AsyncTask#onProgressUpdate(java.lang.Object[]) 
*/ 
@Override 
protected void onProgressUpdate(Progress... values) { 
    // TODO Auto-generated method stub 
    super.onProgressUpdate(values); 
} 

}