【发布时间】:2014-03-06 20:13:20
【问题描述】:
我目前正在设计一个应用程序,让用户可以阅读新闻文章以及从 Internet 获取信息以填充列表并将其显示给用户所必需的信息。我已经完成了所有的解析工作,并且文章的正确信息可以正常返回。我的应用程序中有一个带有片段的主要活动,这些活动是使用视图寻呼机设置的。所以我有三个选项卡,用户可以在它们之间切换。这看起来类似于目前市场上的 Zedge 应用程序。由于我有单独的片段,将异步任务放在我的应用程序中的明智之处在哪里?
我本来打算把它放在主活动的 onCreate 方法中,但由于异步任务与 UI 线程同时在后台运行,因此由于异步任务尚未完成,因此设置为空白,其中没有任何内容。似乎当我的 asyc 任务是 postExecute 方法时,UI 设置已经完成或几乎完成,并且应该从异步任务返回的变量(一个数组列表)是空的。而且我猜我不能只将返回的 onPostExecute 值分配给静态变量,因为我不知道异步任务何时会与 UI 线程相关?
我还有另一个想法,将更新片段 UI 的方法放入它们的类中,并让 onPostExecute 调用它们来修改事物(即重新填充 UI 元素)。我知道让 UI 线程显式等待不是一个好主意,所以我试图避免这种情况。我的异步任务至少可以吗?希望我所说的一切听起来不像是一堆乱七八糟的东西。如果有人可以帮助我了解如何加载我的应用程序信息,我将不胜感激!
private class GetArticlesFromRSS extends
AsyncTask<Void, Void, ArrayList<Article>>
{
ArrayList<Article> retArtList = new ArrayList<Article>();
ProgressDialog dialog = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(MainActivity.this);
dialog.setMessage("Loading...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected ArrayList<Article> doInBackground(Void... v)
{
// TODO Auto-generated method stub
artReaderObj = new ArticleRSSReader(urlArticles);
try
{
artReaderObj.fetchXML();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(IOException ioe)
{
task1.cancel(true);
}
while (artReaderObj.parsingComplete)
;
retArtList.addAll(artReaderObj.getArticles());
return retArtList;
}
@Override
protected void onPostExecute(ArrayList<Article> result)
{
dialog.dismiss();
articlesReturned = result;
if (MainActivity.articlesReturned.size() > 0){
Toast.makeText(getApplicationContext(), "Ok", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getApplicationContext(), "Error, Check Network Connection.", Toast.LENGTH_LONG).show();
}
}
}
【问题讨论】:
-
我唯一不太明白的...你的问题是什么?如何让你的 UI 不显示空白信息?
标签: java android multithreading asynchronous