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