在主线程中等待 AsyncTask

Posted

技术标签:

【中文标题】在主线程中等待 AsyncTask【英文标题】:wait in the main thread for an AsyncTask 【发布时间】:2013-05-23 20:16:10 【问题描述】:

在我的应用程序中,我需要执行网络操作,因此我创建了一个 AsyncTask 类以在后台执行它,但随后我需要用我获得的信息填充一些文本视图。

所以我的问题是我可以在主线程中做什么来等待AsyncTask 类完成doInBackground 操作

这是我的 AsyncTask 类:

public class ObtenerDatos extends AsyncTask<Void, Void, Void> 

    private PuertosSaxParser saxparser;
    private ArrayList<clsPuertos> Puertos;

    /** Return the Puertos info to the main class */
    public ArrayList<clsPuertos> getPuertos() 
        return Puertos;
    

    /** Get the XML info and do the parse */
    @Override
    protected Void doInBackground(Void... params) 
        try 
            saxparser = new PuertosSaxParser("http://www.androide.comyr.com/valores.xml");
            Puertos = saxparser.parseXML();
         catch (Exception e) 
            e.printStackTrace();
        
        return null;
    


这就是我从主线程中调用它的方式:

try 
    int_datos.execute();
    //HERE I NEED TO WAIT FOR THE AsyncTask TO COMPLETE THE doInBackground OPERATIONS
    Puertos = int_datos.getPuertos();
    //THEN I FILL THE TEXTVIEWs WITH THE INFO OF Puertos
 catch (Exception e) 
    e.printStackTrace();

感谢您的帮助!

编辑:

主类:

ObtenerDatos int_datos = new ObtenerDatos(this);
int_datos.execute();

ObtenerDatos(AsyncTask 类):

public class ObtenerDatos extends AsyncTask<Void, Void, Void> 

    private PuertosSaxParser saxparser;
    private ArrayList<clsPuertos> Puertos;
    private Context contexto;
    final TextView textSanferPleamarHora = new TextView(contexto);

    public ObtenerDatos(Context contexto)
        this.contexto = contexto;
    

我尝试将上下文从 Main 传递到 AsyncTask 类以在那里设置 TextViews 但我遇到了一些错误。

是这样吗?

【问题讨论】:

在 onPostExecute() 中设置文本或更新 ui 或使用 runonuithread un doinbackgroundd() 更新 ui 你也可以像我在这里一样使用回调:github.com/nedwidek/Android-Rest-API。基本的一点是你不要等待。您允许 UI 线程继续运行,以便系统保持响应并在服务器返回数据时继续执行。 【参考方案1】:

所以我的问题是我可以在主线程中做什么来等待 AsyncTask 类完成“doInBackground”操作

不要这样做。使用AsyncTask 之类的完整的重点阻塞主应用程序线程。

请在AsyncTaskonPostExecute() 中“用我得到的信息填写一些文本视图”。

【讨论】:

谢谢,我试着像你说的那样做,但我需要从 MainClass 获取“上下文”到 AsyncTask 类来设置 TextViews 但我有问题,我有错误将上下文从 main 传递给另一个类。我在我的问题中举了一个新的例子这是对的吗?再次感谢 @Fox:“对吗?” - 可能不是。通常您不会以这种方式从 Java 代码创建TextView。目前管理AsyncTask 的最佳方式是将其由保留的Fragment 持有。然后AsyncTask 可以使用Fragment 中的onPostExecute()(或onProgressUpdate())来获取更新结果所需的小部件。【参考方案2】:

无论你想设置什么数据到 textView,你都可以简单地在 postExecute 方法中完成,你可以从 doInbackground 共享你的数据,只需将最后一个 void 作为字符串并传递字符串

【讨论】:

以上是关于在主线程中等待 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

android AsyncTask 怎么返回值给UI线程

从 url 下载 pdf 文件在主线程上工作,但是当我使用 asynctask 时出错

别再傻傻得认为AsyncTask只可以在主线程中创建实例和调用execute方法

让一个 AsyncTask 等待另一个完成?

在服务中使用 AsyncTask

在主窗体关闭并且不等待线程完成后让线程运行