首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncTask返回值

AsyncTask返回值
EN

Stack Overflow用户
提问于 2011-03-28 10:13:50
回答 4查看 55.3K关注 0票数 29

我的安卓应用程序连接到我的网站检索和上传信息,所以我使用一个AsyncTask线程。

在一个实例中,我需要我的线程向我的主线程返回一个真值或一个假值。

有办法从AsyncTask执行函数获得这个返回值吗?

当我做以下事情时:

代码语言:javascript
复制
Toast.makeText(Locate.this, "Testing : "+locationUpdate.execute(location), Toast.LENGTH_LONG).show();

我只是有点胡言乱语。

我想我需要的是暂停主线程直到第二个线程完成。第二个线程调用主线程中的一个函数来设置返回值。因此,当第二个线程完成时,主线程可以取消暂停并访问第二个线程设置的返回值,如果逻辑正常,请提供建议.谢谢!

EN

回答 4

Stack Overflow用户

发布于 2011-09-14 22:13:01

为此,可以使用AsyncTask 得到()方法。它在必要时等待计算完成,然后检索其结果:

代码语言:javascript
复制
Toast.makeText(Locate.this, "Testing : " + locationUpdate.execute(location).get(), Toast.LENGTH_LONG).show();

但是,请确保在很长一段时间内不要阻塞主线程,因为这会导致UI和ANR响应迟钝。

更新

我忽略了这个问题关于异步web下载/上传的问题。Web/网络操作应该被认为是一种长时间的操作,因此“暂停UI线程并等待下载完成”的方法总是错误的。使用通常的结果发布方法intstead (例如:AsyncTask.onPostExecute、Service + sendBroadcast、库(如Volley、RoboSpice、DataDroid等))。

票数 41
EN

Stack Overflow用户

发布于 2011-03-28 10:34:10

处理程序是在onPostExcecute()方法中执行此操作的最佳方法。

代码语言:javascript
复制
@Override
    protected void onPostExecute(Boolean bool) {
        super.onPostExecute(bool);
           Message msg=new Message();
            msg.obj=bool;
            mHandler.sendMessage(msg);
        }
    }

而您的消息处理程序将是

代码语言:javascript
复制
mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
        bool i=(String)msg.obj;
    }
 };
票数 4
EN

Stack Overflow用户

发布于 2012-08-17 13:16:21

代码语言:javascript
复制
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;
}   

}

这是作为..。(在teh调用类中显示方法的结束)

代码语言:javascript
复制
        asyncWebCall (url1,CONSTANT);
}
private void asyncWebCall(String url,int actionPostExecute){
    new WebCall().execute(url,String.format("%d",actionPostExecute));
}   

业务的异步部分是..。注意,onPostExecute中的case语句--这是再次将返回值ito程序的关键。注意,调用new ().execute(url,String.format("%d",actionPostExecute));是线程中完成的最后一件事,不能执行进一步的语句,控件通过onPostExecute返回。

代码语言:javascript
复制
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;
        }
    }

} //课末

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5457493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档