Как запустить задачу Async для заданного таймаута?

Я хочу запустить мою задачу Async, которая с определенной точностью извлекает co-odinates и запускает другую деятельность, если она получает координаты.

Теперь я хочу настроить время, чтобы, если он не получает координаты с заданной точностью, задача Async должна уничтожать себя (удалять обновления местоположения и т. Д.), И передается значение по умолчанию для Lattitude / Longitude.

Я попытался использовать это: new GetGPShotfix().execute().get(1, TimeUnit.MINUTES); Чтобы установить тайм-аут для этой асинхронной минуты, а затем перейти к следующей строке / задаче ниже этого вызова асинхронного вызова.

Но в моем случае он переходит к следующей строке, не дожидаясь таймаута, установленного Async.

Как я могу сделать это так, как я хочу? Я также пробовал использовать thread- join() но, видимо, результаты были такими же 🙁

Обновление : вот мой код (для gpshotfix () Async):

 private class GetGPShotfix extends AsyncTask<Void, Void, Void> { // ProgressDialog progressDialogGPS; @Override protected void onPreExecute() { super.onPreExecute(); Log.i("GPSfixer", "Ready to get GPS Hotfix"); } @Override protected Void doInBackground(Void... params) { try { LocationRetriever myLoc = new LocationRetriever(); // myLoc.getUserLoc(); //if (gotLoc == 0 && (firstLoc.getAccuracy() > 10)) { if (gotLoc == 0) { myLoc.getUserLoc(); } } catch (Exception e) { Log.i("GPSfixer", "GPS Hotfix Failed!", e); } finally { Log.i("GPSfixer", "Get GPS Hotfix Completed..."); } return null; } @Override protected void onCancelled() { Log.i("GPSfixer", "Get GPS Hotfix Cancelled"); } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); Log.i("GPSfixer", "GPS Hotfix cycle completed"); System.out.println("Lon :" + myCurrentLon + "Lon2: " + finalLonNow); System.out.println("Lat :" + myCurrentLat + "Lat2: " + finalLatNow); //pDialog2.dismiss(); // progressDialogGPS.dismiss(); } } public class LocationRetriever { final LocationManager locationManager = (LocationManager) StoreSelection.this.getSystemService(Context.LOCATION_SERVICE); final LocationListener locationListener = new LocationListener() { public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), provider + " is disabled!", Toast.LENGTH_SHORT).show(); Toast.makeText(getApplicationContext(), "Please standby..enabling " + provider, Toast.LENGTH_SHORT).show(); // explicitly enable GPS Intent enableGPS = new Intent("android.location.GPS_ENABLED_CHANGE"); enableGPS.putExtra("enabled", true); sendBroadcast(enableGPS); // explictly disable GPS /* * Intent intent = new * Intent("android.location.GPS_ENABLED_CHANGE"); * intent.putExtra("enabled", false); sendBroadcast(intent); */ } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), provider + " is enabled..", Toast.LENGTH_SHORT).show(); } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub /* * System.out.println("val of status: " + status + " provider: " * + provider); */ if (status == 1) { Toast.makeText(getApplicationContext(), provider + " is enabled & available..", Toast.LENGTH_SHORT).show(); System.out.println(provider + " is NOT available!"); } else { System.out.println(provider + " is NOT available!"); } /* progressDialogGPS.dismiss(); */ } public void onLocationChanged(Location location) { // TODO Auto-generated method stub // ORIG CODE --BELOW-- // moved lat/lon vars to top ^ myCurrentLon = location.getLongitude(); myCurrentLat = location.getLatitude(); firstLoc = location; myCurrentLon = Double.parseDouble(new DecimalFormat("##.#########") .format(myCurrentLon)); myCurrentLat = Double.parseDouble(new DecimalFormat("##.#########") .format(myCurrentLat)); /*Toast.makeText(getApplicationContext(), myCurrentLat + " " + myCurrentLon, Toast.LENGTH_SHORT) .show();*/ System.out.println(myCurrentLat + " " + myCurrentLon); float acc=location.getAccuracy(); /*Toast.makeText(getApplicationContext(), "Acc.: " + acc,Toast.LENGTH_SHORT).show();*/ // -- // get best out of 2 locs. --BEGINS-- /* * makeUseOfNewLocation(location); * * if(currentBestLocation == null){ currentBestLocation = * location; } */ if (myCurrentLon != null && myCurrentLat != null && (firstLoc.getAccuracy() <= 10)) { // added // chk // for // online.. gotLoc = 1; System.out.println("OK GOTLOC == 1 !"); System.out.println("Got your Current Location..disabling GPS to save Battery Power.."); Toast.makeText(getApplicationContext(), "Got your Current Location..disabling GPS to save Battery Power..", Toast.LENGTH_SHORT).show(); // removing updates // locationManager.removeUpdates(locationListener); // explicitly turning off GPS Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE"); intent.putExtra("enabled", false); sendBroadcast(intent); System.out.println("GPS disabled!"); finalLatNow = myCurrentLat; finalLonNow = myCurrentLon; // // if(gotLoc == 0){ if (myCurrentLon != null && myCurrentLat != null && (firstLoc.getAccuracy() <= 10)) { // locationManager.removeUpdates(locationListener); gotLoc = 1; Intent i = new Intent(StoreSelection.this, LastVisitDetails.class); i.putExtra("currUsrLon", myCurrentLon); // 2nd i.putExtra("currUsrLat", myCurrentLat); // 1st i.putExtra("storeID", selStoreID); i.putExtra("selStoreName", selStoreName); i.putExtra("imei", uuid); i.putExtra("date", userDate); runOnUiThread(new Runnable() { public void run() { try { // stuff here pDialog2.dismiss(); } catch (Exception e) { e.printStackTrace(); } } }); System.out.println("--Removing Loc. Updates--"); remUpdates(); syncTIMESTAMP = System.currentTimeMillis(); Date dateobj = new Date(syncTIMESTAMP); SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); fullFileName1 = df.format(dateobj); dbengine.open(); dbengine.UpdateStoreStartVisit(selStoreID, fullFileName1); dbengine.close(); startActivity(i); finish(); } else { if (myCurrentLon == null && myCurrentLat == null) { // alert + GPS not locking on..do something() } else { } /*if (!isOnline()) { // alert + not online...do something() showNoConnAlert(); } else { }*/ } // /* * } else{} */ } else { System.out.println("INSIDE ELSE -- GOTLOC"); } } }; // locationManager.requestLocationUpdates(locationManager.getBestProvider(new // Criteria(), true), 2000, 4, locationListener); // enable gps everytime we request location update /* * Intent enableGPS = new Intent("android.location.GPS_ENABLED_CHANGE"); * enableGPS.putExtra("enabled", true); sendBroadcast(enableGPS); */ // ** ORIG Grequest location updates from GPS string /* * locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, * ONE_MIN, 4, locationListener); */ // ** now remove updating of co-ordinates // locationManager.removeUpdates(locationListener); /*public Location getBestLoc(){ if(firstLoc.getAccuracy() <= newLoc.getAccuracy() && newLoc.getAccuracy() <= 10) { return firstLoc; } else if(newLoc.getAccuracy() <= firstLoc.getAccuracy() && newLoc.getAccuracy() <= 10){ return newLoc; } else { return newLoc; } }*/ void getUserLoc() { if (gotLoc == 1 && (firstLoc.getAccuracy() <= 10)) { locationManager.removeUpdates(locationListener); } else { } final Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setHorizontalAccuracy(Criteria.ACCURACY_FINE); // criteria.setVerticalAccuracy(Criteria.NO_REQUIREMENT); criteria.setAltitudeRequired(false); // criteria.setBearingAccuracy(Criteria.NO_REQUIREMENT); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_HIGH); runOnUiThread(new Runnable() { public void run() { try { // stuff here /* * progressDialogGPS = ProgressDialog.show(_activity, * null, null); * progressDialogGPS.setContentView(R.layout.loader); * progressDialogGPS * .getWindow().setType(WindowManager.LayoutParams * .TYPE_KEYGUARD_DIALOG); */ /*locationManager .requestLocationUpdates(locationManager .getBestProvider(criteria, true), TEN_SECS, 4, locationListener);*/ locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0l, 0.0f, locationListener); // remove updates # if (gotLoc == 1 && (firstLoc.getAccuracy() <= 10)) { locationManager.removeUpdates(locationListener); } else { } } catch (Exception e) { e.printStackTrace(); } } }); /* * try { Thread.currentThread().sleep(2000); } catch * (InterruptedException e) { // TODO Auto-generated catch block * e.printStackTrace(); } */ } void remUpdates() { //if(firstLoc.getAccuracy() <= 10){ locationManager.removeUpdates(locationListener); //} //else {} } } 

Любая помощь заметна.

При использовании execute.get (1, TimeUnit.MINUTES) он преобразует задачу async в синхронизм. В этом случае использование async-задачи бесполезно. Вы можете начать отдельный поток при запуске asynctask, чтобы следить за временем и выполнять требуемую операцию после этого. Вы можете создать класс implmenting runnable и передать asyctask в качестве аргумента конструктора и отменить его внутри.

 class checkAyscTask implements Runnable { AsyncTask<Void, Void, Boolean> mAT; Context context; public checkAyscTask(AsyncTask<Void, Void, Boolean> at) { mAT = at; } @Override public void run() { mHandler.postDelayed(runnable, 60000); // After 60sec the task in run() of runnable will be done } Handler mHandler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { if (mAT.getStatus() == Status.RUNNING || mAT.getStatus() == Status.PENDING) { mAT.cancel(true); //Cancel Async task or do the operation you want after 1 minute } } }; } task_GetGPS = new GetGPShotfix(); task_GetGPS.execute(); checkAyscTask chk = new checkAyscTask(task_GetGPS); // Thread keeping 1 minute time watch (new Thread(chk)).start();