如何在AlarmManager运行的服务类上正确运行异步任务

时间:2014-03-09 17:28:07

标签: android android-asynctask android-service alarmmanager

我正在运行AlarmManager,使用此Serivcex SecondsIntent 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}}

2 个答案:

答案 0 :(得分:0)

我在代码中看到的唯一奇怪的事情与AsyncTask的Params参数有关。您的声明如下:

public class SendLocation extends AsyncTask<Object, Void, Void> 

Params被定义为Object的位置,但在调用execute时,您传递的latitudelongitude是{{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());