我正在运行AlarmManager
,使用此Serivce
每x Seconds
个Intent intent = new Intent(AndroidGPSTrackingActivity.this,
AppService.class);
PendingIntent sender =
PendingIntent.getService(AndroidGPSTrackingActivity.this,
0, intent, 0);
AlarmManager am = (AlarmManager)
getSystemService(ALARM_SERVICE);
am.cancel(sender);
<service android:name=".AppService" />
服务类声明为:
清单中的public class AppService extends Service {
GPSTracker gps;
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "Service Created", 1).show();
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "Service Destroy", 1).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "Service Running ", 1).show();
PowerManager pm = (PowerManager) this.getSystemService(this.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
gps = new GPSTracker(this);
if (gps.canGetLocation()) {
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
SendLocation SendLocation = new SendLocation();
SendLocation.execute(latitude, longitude);
} else {
gps.showSettingsAlert();
}
wl.release();
return super.onStartCommand(intent, flags, startId);
}
}
。
AppService.java:
public class SendLocation extends AsyncTask<Object, Void, Void> {//line 18
private Double latitude, longitude;
private String userName, password;
GlobalClass Global = new GlobalClass();
protected Void doInBackground(Object... params) {
latitude = (Double) params[0];
longitude = (Double) params[1];
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(Global.getHostServer());//line 28
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("strLat", Double
.toString(latitude)));
nameValuePairs.add(new BasicNameValuePair("strLong", Double
.toString(longitude)));
nameValuePairs.add(new BasicNameValuePair("userName", Global.getUserName()));
nameValuePairs.add(new BasicNameValuePair("password", Global.getPassword()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
String responseStr = EntityUtils.toString(response.getEntity());
Log.d("Response",responseStr);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
SendLocation.java:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at java.net.URI.parseURI(URI.java:353)
at java.net.URI.<init>(URI.java:204)
at java.net.URI.create(URI.java:725)
at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79)
at com.example.gpstracking.SendLocation.doInBackground(SendLocation.java:28)
at com.example.gpstracking.SendLocation.doInBackground(SendLocation.java:18)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
03-10 00:43:32.803 1693-1693/com.example.gpstracking E/Trace﹕ error opening trace file: No such file or directory (2)
03-10 00:43:32.979 1693-1708/com.example.gpstracking E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at java.net.URI.parseURI(URI.java:353)
at java.net.URI.<init>(URI.java:204)
at java.net.URI.create(URI.java:725)
at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79)
at com.example.gpstracking.SendLocation.doInBackground(SendLocation.java:28)
at com.example.gpstracking.SendLocation.doInBackground(SendLocation.java:18)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
它工作了一段时间,然后突然我得到两个错误,一个在18行,一个在28,然后最终......一个力量关闭。我有什么想法让这种力量接近?
更新 当android在试图释放内存时自动杀死应用程序时,原来是一个明确的力量关闭。我该如何解决这个问题?
logcat的:
{{1}}
答案 0 :(得分:0)
我在代码中看到的唯一奇怪的事情与AsyncTask的Params
参数有关。您的声明如下:
public class SendLocation extends AsyncTask<Object, Void, Void>
Params
被定义为Object
的位置,但在调用execute
时,您传递的latitude
和longitude
是{{1}类型的变量}}
double
您应该像这样更改AsyncTask的定义:
SendLocation.execute(latitude, longitude);
答案 1 :(得分:0)
事实证明,在App Force Close上,它会关闭我的全局类,而且我没有全局变量。我通过将所有信息作为参数传递来修复它:
protected Void doInBackground(Object... params) {
latitude = (Double) params[0];
longitude = (Double) params[1];
userName = (String) params[2];
password = (String) params[3];
hostServer = (String) params[4];
并在服务中调用,如:
SendLocation.execute(latitude, longitude, Global.getUserName(), Global.getPassword(), Global.getHostServer());