【发布时间】:2015-09-19 18:00:46
【问题描述】:
我是 android 开发的新手,作为我学习的一部分,我正在制作一个多语言新闻阅读器应用程序,该应用程序从 google 新闻获取 rss 提要并进行解析。
为此,我使用选项卡式视图来显示多种语言,用户可以滑动浏览不同的语言。应用程序包含印地语、马拉雅拉姆语、英语和泰米尔语选项卡,都列出了特定的新闻项目。
每个语言视图页面都是单独的片段。并且应用程序中总共有四个片段,主要活动包含所有这些。
对于所有这些片段,我有一个 AsyncTask 扩展类,它从服务器加载和解析新闻。并在其 doInBackground 方法上返回一个数组列表,但问题是当我从一个选项卡滑动到另一个选项卡时,它非常有效慢。我正在粘贴我的代码。我认为我的 AsyncTask 用法不正确,因为我在 onPreExecute 方法中显示了一个进度条,但它也没有正确显示。
请任何人查看我的代码并帮助我更正
EnglishNewsFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ArrayList<HashMap<String, String>> newsWrapper;
context = getActivity();
View rootView = inflater.inflate(R.layout.english_news_fragment, container, false);
NewsLoader newsLoader = new NewsLoader(context, language);
newsLoader.execute();
try {
newsWrapper = newsLoader.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
showNews(newsWrapper);
}
return rootView;
}
新闻加载器
public class NewsLoader extends AsyncTask{
public NewsLoader(Context context, String language) {
this.context = context;
this.language = language;
}
@Override
protected void onPreExecute() {
startDialogue();
initAll(language);
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
getNews();
news = processXML();
} catch (Exception e) {
e.printStackTrace();
}
return news;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> aVoid) {
super.onPostExecute(aVoid);
stopDialogue();
}
}
更新
AsyncTask.get() 会阻塞 UI。所以我必须实现一个回调接口,有人可以帮我做吗?我从here读了一点,但是它的调用将如何以及如何将结果传递给 MainActivity ?
截图
【问题讨论】:
-
顺便说一句:调用
super.onPostExecute()和super.onPreExecute()是没用的,因为在超类中没有默认实现 -
为什么不使用 onProgressUpdate 来更新进度条?
-
bcs我不更新进度,只显示一个spinner,就够了
-
你能在片段中发布 showNews() 并在 AsyncTask 方法中发布 initAll()
-
这是一个非常好的 AsyncTask 用法示例 - vogella.com/tutorials/AndroidBackgroundProcessing/…
标签: java android android-fragments android-asynctask