2016-01-22 49 views
0

目前,我的應用程序需要做的每5秒一個的任務,這涉及到更新標記的位置在谷歌地圖API的使用地圖。但是,只有當應用程序打開並且人們正在使用它時,才需要每5秒鐘完成一次。僅當應用程序打開時,我如何每隔幾秒就運行一次Android代碼?

看來的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) 
} 

回答

1

你可以使用一些變通方法來創建一個長期運行的AsyncTask,並相應地管理它的生命週期活動的生命週期。

You can cancel the AsyncTask in the onStop method of you Activity. 
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); 

} 

*定時器有一些缺點由的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);

你怎麼看?

相關問題