Как разрешить задачу Async Task на Android

Я работаю над приложением, которое извлекает данные из сети, сохраняет их на устройстве, а затем читает их. Проблема в том, что я получаю свои данные в Async Task. И мое приложение не позволяет завершить задачу, прежде чем пытаться показать данные пользователю. Я пробовал task.get (), но без результата (он просто останавливается там).

Вот моя задача:

public GetOptionsTask(XMLPortalGetOptions request) { super(request); } protected void onCancelled(){ // TODO afficher message pas d'options sur le disque } @Override public void handleError(Transaction transaction) { // TODO afficher message pas d'options sur le disque } @Override public void handleSuccess(Transaction transaction) { saveOptions(transaction.getResponse()); request = null; Log.d(OptionsManager.class.getName(), this.getStatus().toString()); } 

Эта задача представляет собой экземпляр моей пользовательской задачи Async:

 protected BaseXMLTransaction request; public abstract void handleError(Transaction transaction); public abstract void handleSuccess(Transaction transaction); public TransactionTask(BaseXMLTransaction request){ this.request = request; } @Override protected Void doInBackground(Void... params) { try { Log.i(TransactionTask.class.getName(), "Doing in background"); SocketHandler.sendTransaction(this, request.getRequest()); } catch (SocketHandlerNotConfiguredException e) { Log.e(TransactionTask.class.getName(), "SocketHandler's parameters were not set."); } return null; } @Override public void transactionResult(Transaction transaction) { switch (transaction.getCode()) { case ERROR: Log.e(TransactionTask.class.getName(), "ERROR !!!"); handleError(transaction); break; case NO_CLIENT: Log.e(TransactionTask.class.getName(), "No Client Error"); handleError(transaction); break; case NO_SERVER: Log.e(TransactionTask.class.getName(), "No Server Error"); handleError(transaction); break; case OLD_VERSION: Log.e(TransactionTask.class.getName(), "Old Version"); handleError(transaction); break; case TIMEOUT: Log.e(TransactionTask.class.getName(), "Transaction Timeout"); handleError(transaction); break; case SUCCESS: Log.i(TransactionTask.class.getName(), "Transaction Success"); handleSuccess(transaction); } } 

Я серьезно не знаю, что делать … Выполнение идет быстро, и ничего не делает, так как я не возвращаю ничего, что я предполагаю.

OnPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения фонового вычисления. Результат вычисления фона передается на этот шаг в качестве параметра.

 @Override protected void onPostExecute(String result) { } 
 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } 

И назовите его так:

 new DownloadFilesTask().execute(url1, url2, url3); 

Для этого я использую интерфейс в качестве делегата. Вот пример:

В моей основной деятельности у меня есть слушатель onClick для запуска моего асинхронного вызова и прослушивателя для обработки после завершения вызова.

 private void enableLocationButton(){ locationButton = (Button) findViewById(R.id.locationButton); locationButton.setEnabled(true); locationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, selectLocationActivity.class); intent.putExtra("serverURL",server.getWebServerAddressField()); startActivityForResult(intent, 200); } }); } @Override protected void onActivityResult(int requestCode,int resultCode, Intent data){ if(resultCode == RESULT_OK) { switch (requestCode){ case 100: processServerResponse((PmsWebServer) data.getBundleExtra("server").get("server")); break; case 200: processLocationResponse((PmsDataSource)data.getBundleExtra("location").get("location")); default:processError(); } }else{ processError(); } } по private void enableLocationButton(){ locationButton = (Button) findViewById(R.id.locationButton); locationButton.setEnabled(true); locationButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, selectLocationActivity.class); intent.putExtra("serverURL",server.getWebServerAddressField()); startActivityForResult(intent, 200); } }); } @Override protected void onActivityResult(int requestCode,int resultCode, Intent data){ if(resultCode == RESULT_OK) { switch (requestCode){ case 100: processServerResponse((PmsWebServer) data.getBundleExtra("server").get("server")); break; case 200: processLocationResponse((PmsDataSource)data.getBundleExtra("location").get("location")); default:processError(); } }else{ processError(); } } 

Где-то в selectLocationActivity у меня есть вызов вызова Async и что-то для обработки ответа, обратите внимание, что этот класс реализует интерфейс, который используется в вызове Async.

 public class selectLocationActivity extends ListActivity implements SoapServiceInterface{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location_select); chosenServer = this.removeURLHeader(getIntent().getStringExtra("serverURL")); this.retrieveLocationOptionsByServer(chosenServer); } private void retrieveLocationOptionsByServer(String server) { Map<String,Object> parms = new HashMap<String,Object>(); parms.put(WEB_SERVER_NAME,server); SoapServiceObject service = new SoapServiceObject(Services.SERVICE_DETAILS,parms); callTheService(service); } private void callTheService(SoapServiceObject service){ SoapServiceHelper helper = new SoapServiceHelper(); helper.delegate = thisActivity; helper.execute(service); } @Override public void serviceCallComplete(SoapObject response){ this.createClickableListOnScreen(response); } //...more code...// } 

ServiceCallComplete запускается asyncTask. Ниже приведен код этой задачи

 public class SoapServiceHelper extends AsyncTask<SoapServiceObject, Void, SoapObject>{ public SoapServiceInterface delegate = null; private Integer RETRY_COUNT = 0; private final Integer MAX_RETRY_COUNT = 2; protected SoapObject doInBackground(SoapServiceObject... args){ SoapServiceObject service = args[0]; try{ service.callTheService(); }catch(Exception e){ System.out.println("An error occurred calling the service\n" + e.getMessage()); } return service.getResponse(); //return callDateTimeService(); } protected void onPostExecute(SoapObject result){ delegate.serviceCallComplete((SoapObject)(result.getProperty(0))); } } 

И, наконец, вот интерфейс

 public interface SoapServiceInterface { public void serviceCallComplete(SoapObject response); } 

Я знаю, что я показываю что-то на экране прямо из моего результата, просто подставляю эту часть с сохранением и чтением;)

Одна вещь с этой задачей состояла в том, что она спасала вещи в одноэлемент. Мне удалось вызвать методы, используя информацию из сети, сохраненной в singleton, в onResume (). Когда потоки заканчиваются, он переходит в onResume, и все работает отлично!