目前,我的应用需要每5秒执行一次任务,其中包括使用Google Maps API使用地图更新标记的位置。但是,当应用程序打开并且人们正在使用它时,它实际上只需要每5秒钟执行一次。
根据互联网上的人们的说法,AsyncTask似乎在应用程序关闭时运行,导致它耗尽了大量的电池寿命。
当且仅当应用程序处于打开状态或刚刚启动时,如何使任务运行?
private class MyAsyncTask extends AsyncTask<String, String, Void> {
InputStream inputStream = null;
String result = "";
@Override
protected Void doInBackground(String... params) {
String url_select = "https://www.example.com/"; // generic
try {
URL url = new URL(url_select);
HttpURLConnection connectTo = (HttpURLConnection) url.openConnection();
connectTo.setRequestProperty("User-Agent", "");
connectTo.setRequestMethod("POST");
connectTo.setDoInput(true);
connectTo.connect();
// Read content & Log
inputStream = connectTo.getInputStream();
} catch (IOException e4) {
Log.e("IOException", e4.toString());
e4.printStackTrace();
}
// Convert response to string using String Builder
try {
BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
StringBuilder sBuilder = new StringBuilder();
String line = null;
while ((line = bReader.readLine()) != null) {
sBuilder.append(line + "\n");
}
inputStream.close();
result = sBuilder.toString();
} catch (Exception e) {
Log.e("St.Build,BuffRead", "Error converting result " + e.toString());
}
return null;
} // protected Void doInBackground(String... params)
@Override
protected void onPostExecute(Void v) {
//parse JSON data
try {
JSONObject busData = new JSONObject(result);
if (busData.getString("title").equals("Bus Positions")) {
for (Marker mark: allBuses) {
mark.remove(); // Remove marker
}
allBuses.clear();
JSONObject resultSet = busData.getJSONObject("ResultSet");
JSONArray results = resultSet.getJSONArray("Result");
for (int i = 0; i < results.length(); i++) {
JSONObject bus = results.getJSONObject(i);
double lat = bus.getDouble("lat");
double lng = bus.getDouble("lng");
int call_name = bus.getInt("call_name");
String bus_type = "bus";
LatLng busLocation = new LatLng(lat,lng);
Marker busMark = map.addMarker(new MarkerOptions()
.position(busLocation)
.title(bus_type)
.icon(BitmapDescriptorFactory.fromResource(R.id.action_search)));
allBuses.add(busMark);
}
}
} catch (JSONException e) {
Log.e("JSONException", "Error: " + e.toString());
} // catch (JSONException e)
} // protected void onPostExecute(Void v)
}
答案 0 :(得分:1)
您可以使用一些变通方法来创建长时间运行的异步任务,并根据活动的生命周期管理其生命周期。
You can cancel the AsyncTask in the onStop method of you Activity.
答案 1 :(得分:0)
在我的网络搜索中,我看到了一些不同的方法,并想知道这样做的最佳方式。
安排服务器呼叫的最佳方式是什么?
我看到的选项是:
<强> 1。计时器强>
的 2。的ScheduledThreadPoolExecutor 强>
***Timer***
int delay = 5000; // delay for 5 sec
int period = 1000; // repeat every sec
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
// // call your MyAsyncTask class
}
}, delay, period);
}
* Timer具有ScheduledThreadPoolExecutor解决的一些缺点。 *
***ScheduledThreadPoolExecutor.***
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("EXESER", "CH EXES");
// Your code
}
});
}
}, 1
0,40,TimeUnit.SECONDS);
你的意见是什么?