Возвращаемое значение AsyncTask
My Android-приложение подключается к моему веб-сайту для извлечения и загрузки информации, поэтому я использую поток AsyncTask.
В одном случае мне нужен мой поток, чтобы вернуть true или false значение в мой основной поток.
Есть ли способ получить это возвращаемое значение из функции выполнения AsyncTask?
Когда я делаю следующее:
Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();
Я просто получаю много тарабарщины.
Я думаю, что мне нужно, чтобы приостановить основной поток до тех пор, пока второй поток не завершится. Второй поток вызывает функцию в основном потоке для установки моего возвращаемого значения.
Поэтому, когда второй поток завершается, основной поток может приостанавливать и получать доступ к возвращаемому значению, заданному вторым потоком
Если эта логика звучит, пожалуйста, предложите предложения... спасибо!
Ответы
Ответ 1
Вы можете использовать метод AsyncTask get(). Он ждет, если необходимо, чтобы вычисление завершилось, а затем извлекает его результат:
Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();
Но обязательно не блокируйте основной поток в течение длительного периода времени, так как это приведет к невосприимчивому интерфейсу и ANR.
UPDATE
Я пропустил вопрос, касающийся асинхронного веб-сайта загрузки/выгрузки. Работа в Интернете/сети должна рассматриваться как длинная, и поэтому подход "приостанавливать поток пользовательского интерфейса и ждать завершения загрузки" всегда неверен. Используйте обычный метод публикации результатов (например: AsyncTask.onPostExecute
, Service + sendBroadcast, библиотеки, такие как Volley, RoboSpice, DataDroid и т.д.).
Ответ 2
Обработчик - лучший способ сделать это
в 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;
}
};
Ответ 3
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;
}
}
}//конец класса
Ответ 4
Вот полный пример проблемы возврата значений из задачи async. Возможно, существует много задач, которые необходимо выполнить один за другим асинхронно.
Основы.
1. получить возвращаемое значение из класса.
public class Snippet {
int computVal;
public Snippet(){
computVal = 17*32;
}
public int getVal(){
return computVal;
}
}
это называется как...
int hooray = (new Snippet()).getVal();