Возвращаемое значение AsyncTask

Мое приложение android подключается к моему веб-сайту для извлечения и загрузки информации, поэтому я использую поток AsyncTask.

В одном случае мне нужен мой поток, чтобы вернуть истинное или ложное значение в мой основной поток.

Есть ли способ получить это возвращаемое значение из функции выполнения AsyncTask?

Когда я делаю следующее:

Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show(); 

Я просто получаю много тарабарщины.

Я думаю, что мне нужно, чтобы приостановить основной поток до тех пор, пока второй поток не завершится. Второй поток вызывает функцию в основном потоке для установки моего возвращаемого значения. Таким образом, когда второй поток завершается, основной поток может прервать и получить доступ к возвращаемому значению, заданному вторым потоком. Если эта логика звуковая, пожалуйста, предложите предложения … спасибо!

Solutions Collecting From Web of "Возвращаемое значение AsyncTask"

Для этого вы можете использовать метод asyncTask get () . Он ждет, если необходимо, чтобы вычисление завершилось, а затем извлекает его результат:

 Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show(); 

Но обязательно не блокируйте основной поток в течение длительного периода времени, так как это приведет к невосприимчивости к пользовательскому интерфейсу и ANR .

ОБНОВИТЬ
Я пропустил тот вопрос, который касался загрузки / загрузки асинхронных веб-сайтов . Работа в сети / сети должна рассматриваться как длинная, и поэтому подход «приостанавливать поток пользовательского интерфейса и ждать завершения загрузки» всегда неверен. Используйте обычный метод публикации результатов (например: AsyncTask.onPostExecute , Service + sendBroadcast, библиотеки, такие как Volley, RoboSpice, DataDroid и т. Д.).

Обработчик – лучший способ сделать это в onPostExcecute() просто сделать

 @Override protected void onPostExecute(Boolean bool) { super.onPostExecute(bool); Message msg=new Message(); msg.obj=bool; mHandler.sendMessage(msg); } } 

И ваш обработчик сообщений будет

 mHandler = new Handler() { @Override public void handleMessage(Message msg) { bool i=(String)msg.obj; } }; 
 public class RunWebScript { String mString; public RunWebScript(String url){ try { URL updateURL = new URL(url); URLConnection conn = updateURL.openConnection(); // now read the items returned... InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while((current = bis.read()) != -1){ baf.append((byte)current); } String s = new String(baf.toByteArray()); mString = s; } catch (Exception e) { Log.e("ANDRO_ASYNC", "exception in callWebPage",e); mString = "error"; } } public String getVal(){ return mString; } 

}

Это выполняется как … (показывая конец метода в вызывающем классе

  asyncWebCall (url1,CONSTANT); } private void asyncWebCall(String url,int actionPostExecute){ new WebCall().execute(url,String.format("%d",actionPostExecute)); } 

Асинхронная часть бизнеса … Обратите внимание на оператор case в onPostExecute, это ключ к возврату возвращаемого значения ito вашей программы. Обратите внимание, что вызов new WebCall (). Execute (url, String.format ("% d", actionPostExecute)); Это последнее, что сделано в потоке, никакие дальнейшие утверждения не могут быть выполнены, управление возвращается через onPostExecute.

 class WebCall extends AsyncTask<String, String, String>{ int chooser = -1; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... params) { try { chooser = Integer.parseInt(params[1]); } catch(NumberFormatException nfe) { Log.d("ANDRO_ASYNC",String.format("asyncReturn() mString numberformatexception = %s",params[1])); chooser = 0; } return(new RunWebScript(params[0])).getVal(); } protected void onProgressUpdate(String... progress) { } @Override protected void onPostExecute(String gotFromDoInBkgnd) { Log.d("ANDRO_ASYNC",String.format("chooser = %s",chooser)); switch (chooser){ case CONSTANT: printStringx(gotFromDoInBkgnd); asyncWebCall(url2,5); break; case 0: Log.d("ANDRO_ASYNC",String.format("case 0 = %s",gotFromDoInBkgnd)); break; case 5: Log.d("ANDRO_ASYNC",String.format("case 5 = %s",gotFromDoInBkgnd)); asyncWebCall(url3,7); break; default: Log.d("ANDRO_ASYNC",String.format("man we got problems = %s",gotFromDoInBkgnd)); break; } } 

} // конец класса

Ниже приведен полный пример проблемы возврата значений из задачи async. Возможно, существует много задач, которые необходимо выполнить один за другим асинхронно.

Основы. 1. получить возвращаемое значение из класса.

 public class Snippet { int computVal; public Snippet(){ computVal = 17*32; } public int getVal(){ return computVal; } 

}

Это называется …

 int hooray = (new Snippet()).getVal();