2015-04-17 2 views
0

Я выбираю местоположение пользователя в службе, которая реализует LocationListener. И в методе OnlocationChanged() я создаю экземпляр класса asynctask, который будет загружать значения в онлайн-базу данных. Проблема заключается в том, что, как только метод OnlocationChanged() вызывается Listener, создается новый экземпляр asynctask и он замедляет работу устройства. Я хочу, чтобы метод/механизм ограничивал экземпляры asynctask до не более 5.создавать ограниченные экземпляры AsyncTask

ответ

0

Это очень похоже на пулы в Java (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) новый 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); 
} 

}