2013-10-09 43 views
0

我创建电话跟踪应用程序,我想从我跟踪的设备上的互联网(实际上是经度和纬度)获取数据。被跟踪的手机没问题,他们会将每次执行的onLocationChanged的纬度和经度发送到我的数据库服务器。 而对于跟踪手机应用程序,我可以得到这些数据,但只是一旦创建。我使用asynctask获取数据,问题是我有difficluties每X分钟获取该数据,我应该使用处理程序?有人可以帮我一些代码吗?每x分钟从互联网上获取数据

这里是我到目前为止的代码

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final String Url = "http://mysite.com/tes.php"; 

    mf =(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
    gmap = mf.getMap(); 
    gmap.setMyLocationEnabled(true); 
    gmap.setMapType(gmap.MAP_TYPE_SATELLITE); 

    lat= (TextView) findViewById(R.id.lati); 
    longit = (TextView) findViewById(R.id.longi); 



      // TODO Auto-generated method stub 
      lokasibaru lokasi = new lokasibaru(); 
      lokasi.execute(Url); 


} 

,这是我的AsyncTask

private class lokasibaru extends AsyncTask <String,ArrayList<String>,ArrayList<String>>{ 

    String latitude,longitude;  

     protected void onProgressUpdate(String... values) { 


      } 
     protected void onPostExecute(ArrayList<String> hasil) { 

     latitude = hasil.get(0); 
     longitude = hasil.get(1); 
     lat.setText(latitude); 
     longit.setText(longitude); 


     } 

     @Override 
     protected ArrayList<String> doInBackground(String... value) { 
      ArrayList<String> result = null ; 
      String Url = value[0]; 
      koneksi get = new koneksi(); 

      try { 
       //result = GetR.getdata(Url); 
       result = get.getdata(Url); 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



      return result; 
     } 

    } 

,这是我koneksi类从互联网获取数据

public class koneksi { 

public ArrayList<String> getdata(String url) throws Exception{ 
    BufferedReader in = null; 
    String data = null; 
    ArrayList<String> kordinat = new ArrayList<String>(); 
    int count ; 
    try{ 
     HttpClient client= new DefaultHttpClient(); 
     URI site = new URI(url); 
     HttpGet req = new HttpGet(); 
     req.setURI(site); 
     HttpResponse resp = client.execute(req); 
     count =0; 
     in = new BufferedReader(new InputStreamReader(resp.getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String l = ""; 
     String nl = System.getProperty("line.separator"); 

     while ((l = in.readLine()) != null){ 
     //sb.append(l+nl); 
     kordinat.add(l); 
     count++; 
     } 
    in.close(); 
    data = sb.toString(); 
    return kordinat; 
    } 
    finally{ 

    } 

} 

} 

回答

0

使用处理者

private Handler m_handler = new Handler(); 

// ..............

Runnable m_handlerTask = new Runnable() { 

    @Override 
    public void run() { 
     m_handler.postDelayed(m_handlerTask, Xmins); 
      new lokasibaru().execute(); 
    } 
}; 


private void startGettingDataTask() 
{ 
    m_handlerTask.run(); 
} 

private void stopGettingDataTask() 
{ 
    m_handler.removeCallbacks(m_handlerTask); 
} 

呼叫startGettingDataTask()启动和stopGettingDataTask()删除回调!

+0

所以其中i supossed调用该代码?它在OnCreate吗? 此代码有错误 'm_handler.postDelayed(m_handlerTask,INTERVAL);' 它表示“不能引用在不同方法中定义的内部类中的非最终变量m_handlerTask” – user2108272

+0

您在OnCreate中调用startGettingDataTask() ()和onPause()或onDestroy()中的stopGettingDataTask()。至于INTERVAL将其声明为全局变量或者只是在开始处添加最终的结果 –

0

看看Android Service,在服务内创建一个ScheduledExecutorService,它启动一个Runnable任务,请求页面并发送位置。

向该ScheduledExecutorService可以传递的时间间隔,像这样,

//this will run the task every 5 minutes 
scheduleTaskExecutor.scheduleAtFixedRate(task, 0, 5, TimeUnit.MINUTES); 

对于低于API 9

//this will run the task every 5 minutes 
scheduleTaskExecutor.scheduleAtFixedRate(task, 0, 300, TimeUnit.SECONDS); 
+0

请注意,[''TimeUnit.MINUTES'不保证在Android上存在](http://stackoverflow.com/questions/3472423/android-java-util -concurrent-timeunit-convert-milliseconds-to-minutes) –

+0

[TimeUnit](http://developer.android.com/reference/java/util/concurrent/TimeUnit.html)自api 1包含MINUTES,并且每个人都考虑创建应用程序高于api 8. –

+0

不,'TimeUnit.MINUTES'和['TimeUnit.toMinutes(long)'](http://developer.android.com/reference/java/util/concurrent/TimeUnit.html#toMinutes(long) )仅适用于API 9(从[Java 1.5](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html#SECONDS)切换到[1.6](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html#MINUTES)) –