Hello Community,
我是编程的初学者。我尝试了一些代码片段并且它们工作正常。现在我想让他们在一起,但我有一些问题。
我有什么:
我想做什么:
每2分钟,Handy将获取该位置并通过http将信息发送到mysql数据库。
正如我上面所说,每一步都可以正常工作,但将它们放在一起对我来说是一个问题。
我做了什么: 我创建了一个启动屏幕,其中有两个按钮来启动和停止服务。因此,当我关闭应用程序时,启动的服务将继续发送数据:
package ars.samsung.de;
import ars.samsung.de.MyService;
import ars.samsung.de.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SamsungLoc1 extends Activity implements OnClickListener {
private static final String TAG = "ServicesDemo";
Button buttonStart, buttonStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_samsung_loc1);
buttonStart = (Button) findViewById(R.id.buttonStart);
buttonStop = (Button) findViewById(R.id.buttonStop);
buttonStart.setOnClickListener(this);
buttonStop.setOnClickListener(this);
}
public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
Log.d(TAG, "onClick: starting service");
startService(new Intent(this, MyService.class));
break;
case R.id.buttonStop:
Log.d(TAG, "onClick: stopping service");
stopService(new Intent(this, MyService.class));
break;
}
}
}
因此,当单击开始按钮时,服务MyService.class启动:
package ars.samsung.de;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import ars.samsung.de.*;
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
// @Override
public void run() {
String url = "";
String Output ="";
//Called each time when xxx milliseconds (1 second) (the period parameter)
// Locator Start
MyNetworkLocator mnl1 = new MyNetworkLocator();
mnl1.starter(this);
// mnl1.starter(context);
// Locator Ende
MyHilfsklasse mhk1 = new MyHilfsklasse();
try {
//Output = mhk1.my_getUrlContent_v2();
url="http://www.mysite.net/test/location/location_push.php?VONHANDY=c&MYLATITUDE=1.6&MYLONGITUDE=3.2";
Output = mhk1.my_getUrlContent_v3(url);
Log.d(TAG, "Http done");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d(TAG, "Catch: Http");
}
}
},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
120000);
}
}
因此上面的服务将通过新的TimerTask每2分钟执行一次任务。第一步工作正常,每两分钟发送一个虚拟PHP。
但我想现在获取位置信息。在上面的代码中,我在mnl1.starter(this)收到错误。
错误是"The method starter(Context) in the type MyNetworkLocator is not applicable for the arguments (newTimerTask(){})
MyNetworkLocator看起来像这样:
package ars.samsung.de;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class MyNetworkLocator implements LocationListener{
private LocationManager mgr;
private String best;
Location location;
public static double myLocationLatitude;
public static double myLocationLongitude;
public void starter(Context context) {
// mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
mgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
best = mgr.getBestProvider(criteria, true);
// location = mgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
location = mgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
dumpLocation(location);
}
public void onLocationChanged(Location location) {
dumpLocation(location);
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
protected void onPause() {
// super.onPause();
mgr.removeUpdates(this);
}
protected void onResume() {
// super.onResume();
mgr.requestLocationUpdates(best, 15000, 10, this);
}
private void dumpLocation(Location l) {
if (l != null){
myLocationLatitude = l.getLatitude();
myLocationLongitude = l.getLongitude();
}
}
}
我了解到getSystemService(LOCATION_SERVICE)需要一个上下文。所以我编写了context.getSystemService(Context.LOCATION_SERVICE)并将其设置为方法启动器中的参数。
通过
调用此方法mnl1.starter(this);
不起作用,因为“this”不是上下文。
所以我试过
mnl1.starter(context);
我想在run(Context context)中再次将它作为参数。
但这不起作用,因为新的TimerTask必须在没有参数的情况下启动run()。
好吧,我希望你能理解我的问题。我尝试将活动的上下文提供给 getSystemService,但TimerTask总是在没有参数的情况下启动run()。
有没有人可以帮助我?一个代码剪断谁告诉我如何解决问题将是美好的。
来自德国的亲切问候,