لدي نشاط واحد. في هذا النشاط ، قمت بإعدام Asynctask ، لكنه لا يعمل

StackOverflow https://stackoverflow.com/questions/2285917

سؤال

private class ExecuteLocations extends AsyncTask<String, Void, Void>{
    private final ProgressDialog dialog = new ProgressDialog(ListProfiles.this);

    protected void onPreExecute() {
        //this.dialog.setMessage("Starting pre-execute...");
        //this.dialog.show();
    }

    @Override
    protected Void doInBackground(String... arg0) {
        check_profiles_lm=(LocationManager) ListProfiles.this.getSystemService(LOCATION_SERVICE);  
        myLocListen = new LocationListener(){
            @Override
            public void onLocationChanged(Location location) {
                HashMap params = new HashMap();
                params.put("lat", Double.toString(location.getLatitude()));
                params.put("long", Double.toString(location.getLongitude()));
                postData("http://mydomain.com",params);

            }
            @Override
            public void onStatusChanged(String provider, int status,Bundle extras) { 
            }
            @Override
            public void onProviderDisabled(String provider) { 
            }
            @Override
            public void onProviderEnabled(String provider) {
            }
        };      
        check_profiles_lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 0, myLocListen);
        return null;
    }

    protected void  onPostExecute(final Void unused) {
        if (this.dialog.isShowing()) {
            //this.dialog.dismiss();
        }
        //Do something else here 
    }

}

في الأساس ، هدفي هو:

  1. قم باستمرار بنشر خط العرض/خط الطول إلى موقع الويب الخاص بي كل دقيقة أو نحو ذلك.
  2. بالطبع ، أريد أن أفعل ذلك في موضوع آخر ، لذلك لا يفسد موضوع واجهة المستخدم. من المفترض أن يحل هذا insynctask هذا ... لكنه يطرح خطأ ولا أعرف السبب.

ماذا يمكنك أن تفعل لإنجاز هدفي؟ الأمر بسيط للغاية ... فقط مسح الموقع ونشره على الويب كل دقيقة ، في الخلفية.

بالمناسبة ، طريقة oncreate الخاصة بي مثل هذا. هذا هو في الأساس.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            new ExecuteLocations().execute();
            setContentView(R.layout.main_list);
    }
هل كانت مفيدة؟

المحلول

كسرها إلى 3 خطوات:

  1. اصنع ما تريد العمل مع Asynctask
  2. تأكد من أنك اكتشفت Asynctask ، قم بعمل سجل بسيط ("Haha" ، "Gotcha") في doInBackground(...) وتحقق من أنه يظهر
  3. الجمع بين الاثنين.

لهذه الحالة ، ربما أذهب مع Service الناجمة عن AlarmManager. أعتقد أنك ستحتاج إلى الأخير على أي حال.

نصائح أخرى

إنشاء هذا كخدمة. لا حاجة إلى وجود مؤقت أو جهاز إنذار أثناء التسجيل لأحداث الموقع والتصرف بشكل مناسب.

يمكن العثور على مثال على الاستماع إلى أحداث الموقع فيhttp://code.google.com/p/android-luetooth-on-motion/source/browse/#svn/trunk/bluetoothonmotion/src/com/elsewhat

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_NETWORK, MIN_DISTANCE_NETWORK,locationListener);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_GPS, MIN_DISTANCE_GPS,locationListener);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top