Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 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();