在主线程中等待 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
之类的完整的重点是不阻塞主应用程序线程。
请在AsyncTask
的onPostExecute()
中“用我得到的信息填写一些文本视图”。
【讨论】:
谢谢,我试着像你说的那样做,但我需要从 MainClass 获取“上下文”到 AsyncTask 类来设置 TextViews 但我有问题,我有错误将上下文从 main 传递给另一个类。我在我的问题中举了一个新的例子这是对的吗?再次感谢 @Fox:“对吗?” - 可能不是。通常您不会以这种方式从 Java 代码创建TextView
。目前管理AsyncTask
的最佳方式是将其由保留的Fragment
持有。然后AsyncTask
可以使用Fragment
中的onPostExecute()
(或onProgressUpdate()
)来获取更新结果所需的小部件。【参考方案2】:
无论你想设置什么数据到 textView,你都可以简单地在 postExecute 方法中完成,你可以从 doInbackground 共享你的数据,只需将最后一个 void 作为字符串并传递字符串
【讨论】:
以上是关于在主线程中等待 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章
从 url 下载 pdf 文件在主线程上工作,但是当我使用 asynctask 时出错