创建AsyncTask的有限实例

时间:2015-04-17 20:16:13

标签: android android-asynctask locationlistener

我在实现LocationListener的服务中获取用户的位置。在OnlocationChanged()方法中,我创建了一个asynctask类的实例,它将值上传到在线数据库。问题是,只要Listener调用了OnlocationChanged()方法,就会创建一个asynctask的新实例,它会降低设备的速度。我想要一种方法/机制来将asynctask的实例最多限制为 5.

3 个答案:

答案 0 :(得分:0)

使用布尔变量isLoading并将其初始化为false。

在onPreExcecute中的AsynctTask中,使isLoading为true,而在onPostExecute中使isLoading为假

现在在调用asynctask之前,您只需要将以下条件及其完成。我想这就是你想要的东西

如果(!isLoading)   new LongOperation()。execute(“”);

答案 1 :(得分: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);
}

}

答案 2 :(得分: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:我使用了单身模式。