Как вернуть результат из задачи async

Я использую async-задачи для попадания на веб-сервер и обновления элементов управления с использованием результата. У этого есть недостатки, а именно, это делает методы асинхронными, специфичными для элементов управления, и останавливает меня снова с помощью возвращаемой строки.

Как вернуть полученную строку из асинхронного вызова onPostExecute? Как мне это назвать? Кажется, я не могу заставить мой код сделать это. Не должно быть проблем с потоковой обработкой, так как у меня есть диалог, который замораживает пользовательский интерфейс, пока работа не будет выполнена.

Мой типичный код asyncTask выглядит следующим образом

class GetDataFromServer extends AsyncTask<String, String, String> { * */ // Progress Dialog private ProgressDialog qDialog; private Context context; private String dialogString; private ArrayList<String[]> newLoginResult; // JSON parser class String url_newGame ="http://xxxxxx.php"; public myAsyncMethos(String dialogMessage, Context con) { this.qDialog = new ProgressDialog(con); this.dialogString = dialogMessage; this.context = con; } /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); qDialog = new ProgressDialog(this.context); qDialog.setMessage(this.dialogString); qDialog.setIndeterminate(false); qDialog.setCancelable(false); qDialog.show(); } @Override protected JSONObject doInBackground(String... args) { //MAKE SERVER CALL and cast to JSONOBject return jsonNewUser; } public void onPostExecute(JSONObject jsonString) { // dismiss the dialog after getting response qDialog.dismiss(); //I WANT TO RETURN A STRING HERE BUT KEEP GETTING SYNTAX ERRORS BEFORE RUNTIME } } 

Я бы лично добавил обратный вызов к вашему классу, а затем, когда onPostExecute обратный вызов слушателю в основном классе.

 class GetDataFromServer extends AsyncTask<String, String,JSONObject> { // Progress Dialog private ProgressDialog qDialog; private Context context; private String dialogString; private ArrayList<String[]> newLoginResult; private InformComplete myCallback; public GetDataFromServer(String dialogMessage, Context con,InformComplete callback) { this.qDialog = new ProgressDialog(con); this.dialogString = dialogMessage; this.context = con; this.myCallback=callback; } @Override protected void onPreExecute() { // set up your dialog } @Override protected JSONObject doInBackground(String... args) { JSONObject jsonNewUser=new JSONObject(); return jsonNewUser; } public void onPostExecute(JSONObject jsonString) { qDialog.dismiss(); myCallback.PostData(jsonString); } public interface InformComplete { public void PostData(JSONObject result); } } 

Тогда из вашего вызывающего класса у вас будет что-то вроде этого …

  private void callTheAsyncThing { GetDataFromServer gds=new GetDataFromServer("please wait", this, letMeKnow); gds.execute(params); } private InformComplete letMeKnow=new InformComplete() { public void PostData(JSONObject result) { // we now have the data in the calling class } }; 

Вы не можете вернуть значение в методах из AsynTask, потому что оно используется для возврата элемента void. Итак, вы можете указать пример глобального var foe и установить для него значение. Как … `

 class GetDataFromServer extends AsyncTask<String, String, String> { * */ // Progress Dialog private ProgressDialog qDialog; private Context context; private String dialogString; private ArrayList<String[]> newLoginResult; private String value; // JSON parser class String url_newGame ="http://xxxxxx.php"; public myAsyncMethos(String dialogMessage, Context con) { this.qDialog = new ProgressDialog(con); this.dialogString = dialogMessage; this.context = con; } /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); qDialog = new ProgressDialog(this.context); qDialog.setMessage(this.dialogString); qDialog.setIndeterminate(false); qDialog.setCancelable(false); qDialog.show(); } @Override protected JSONObject doInBackground(String... args) { //MAKE SERVER CALL and cast to JSONOBject return jsonNewUser; } public void onPostExecute(JSONObject jsonString) { // dismiss the dialog after getting response qDialog.dismiss(); value = "Whatever you want"; } public void setValue(String value){ this.value=value; } public String getValue(){ return this.value; } }` 

И затем используйте его. Есть один способ вернуть что-то. Кстати, вы не можете изменить возврат.

Метод onPostExecute не является вызовом программиста, который вызывается экземпляром AsyncTask. Если вы хотите вернуть результат из задачи async, вы можете отправить параметр в GetDataFromServer, а в методе onPostExecute вы дадите ему новое значение, а затем , Вы можете использовать Handler для отправки сообщения.

Вы возвращаете JSONObject в doInBackground, пока пытаетесь получить строку в методе onPostExecute.

 public void onPostExecute(JsonObject jsonString) { // dismiss the dialog after getting response qDialog.dismiss(); //I WANT TO RETURN A STRING HERE BUT KEEP GETTING SYNTAX ERRORS BEFORE RUNTIME } 
Intereting Posts
Анимированная анимация для Android с экраном Splash, как приложение Palabre Android Studio: адаптируемая папка: как разместить изображения для нескольких точек на дюйм? Плагин Google Services не может работать без google-services.json Исключение Android Bluetooth .connect () Исключительный адаптер Nexus 7 OBDII Как использовать AndroidHttpClient (API-уровень 8) и UsernamePasswordCredentials? Сглаживание вида преобразуется SetHomeButtonEnabled не работает, но setDisplayHomeAsUpEnabled работает Android салфетки карт с щепоткой для увеличения изображения с помощью SwipeFlingAdapterView библиотеки Панель действия Overlay, закрытая статусной строкой Android: Как я могу показать индикатор выполнения при загрузке данных в WebView? Приложение не получает android.intent.action.DOWNLOAD_COMPLETE намерение Не удается найти файл .android на моем mac, чтобы получить ключ карты? Выделите click clickpan REST – Как ограничить доступ для неавторизованного клиентского программного обеспечения Разница между контекстным меню и меню опций в android