如何在应用程序打开时每隔几秒运行Android代码?

时间:2016-01-22 01:53:16

标签: android google-maps-android-api-2

目前,我的应用需要每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)
}

2 个答案:

答案 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);

你的意见是什么?