Java 返回类型为的异步任务操作
我是android开发新手,作为我学习的一部分,我正在制作一个多语言新闻阅读器应用程序,该应用程序从谷歌新闻获取rss提要并解析 为此,我使用选项卡式视图来显示多种语言,用户可以在不同的语言中滑动。应用程序包含印地语、马来语、英语和泰米尔语标签,所有标签都列出了特定的新闻项目 每个语言视图页都是独立的片段。应用程序中总共有四个片段,主要活动包含所有这些片段 对于所有这些片段,我有一个AsyncTask扩展类,它从服务器加载和解析新闻,并在其doInBackground方法上返回一个数组列表,但问题是当我从一个选项卡切换到另一个选项卡时,它的工作速度非常慢。我正在粘贴我的代码。我认为我的AsyncTask用法不正确,因为我在onPreExecute方法中显示了一个进度条,但它也没有在适当的方式中显示 请任何人查看我的代码并帮助我更正 EnglishNewsFragment.javaJava 返回类型为的异步任务操作,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,我是android开发新手,作为我学习的一部分,我正在制作一个多语言新闻阅读器应用程序,该应用程序从谷歌新闻获取rss提要并解析 为此,我使用选项卡式视图来显示多种语言,用户可以在不同的语言中滑动。应用程序包含印地语、马来语、英语和泰米尔语标签,所有标签都列出了特定的新闻项目 每个语言视图页都是独立的片段。应用程序中总共有四个片段,主要活动包含所有这些片段 对于所有这些片段,我有一个AsyncTask扩展类,它从服务器加载和解析新闻,并在其doInBackground方法上返回一个数组列表,但问
@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;
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
ArrayList新闻包装器;
context=getActivity();
视图rootView=充气机。充气(R.layout.english\u news\u片段,容器,false);
NewsLoader NewsLoader=新的新闻加载器(上下文、语言);
execute();
试一试{
newswapper=newsLoader.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}最后{
showNews(新闻包装);
}
返回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();
}
}
公共类新闻加载器扩展异步任务{
公共新闻加载器(上下文、字符串语言){
this.context=上下文;
这种语言=语言;
}
@凌驾
受保护的void onPreExecute(){
startDialogue();
initAll(语言);
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
获取新闻();
news=processXML();
}捕获(例外e){
e、 printStackTrace();
}
返回消息;
}
@凌驾
受保护的void onPostExecute(ArrayList避免){
super.onPostExecute(避免);
停止对话();
}
}
更新
AsyncTask.get()阻塞UI。因此,我必须实现一个回调接口,有人能帮我实现吗?我读了一点,但它的调用将如何,我如何将结果传递给MainActivity
截屏
方法
Asynctask.get()
会阻塞UI,直到doInBackground()
完成。您可以改为使用onPostExecute()
在UI上返回结果。UI中的减速或瓶颈可能来自onPreExecute
()或onPostExecute
()。添加类似于Log.d
()的代码,并打印时间差,以查看哪个代码导致瓶颈。例如,代码initAll(language)
可以移动到doInBackground
()的非UI线程。也许这种方法很慢。基本上,使用onPreExecute
和onPostExecute
,无论需要做什么,都要快速完成
我认为您不需要调用super.onPreExecute()
或super.onPostExecute(避免)
。谷歌的样本没有这样做,也没有向@提出建议。也许这也造成了瓶颈
希望这对……有帮助。我已经得到了答案
我制作了一个回调接口,用于将结果传递给Fragment
public interface CallBackReciever {
public void recieveData(ArrayList<HashMap<String,String>> result);
}
公共接口回调接收器{
公共无效接收数据(ArrayList结果);
}
并用fragment实现了这个接口
然后将此接口的上下文传递给AsyncTask。在其onPostExecute()方法中调用receiveData()方法
片段
@Override
public void recieveData(ArrayList<HashMap<String, String>> result) {
newsWrapper = result;
showNewsOnUI();
}
@覆盖
公共无效接收数据(ArrayList结果){
新闻包装器=结果;
showNewsOnUI();
}
异步任务
public class NewsLoader extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>>{
public NewsLoader(CallBackReciever callBackReciever) {
this.callBackReciever = callBackReciever;
}
@Override
protected void onPreExecute() {
startDialogue();
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
initAll(language);
result = processNews()
return result;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
stopDialogue();
callBackReciever.recieveData(result);
}
}
公共类新闻加载器扩展异步任务{
公共新闻加载器(CallbackReceiver CallbackReceiver){
this.callbackreceiver=callbackreceiver;
}
@凌驾
受保护的void onPreExecute(){
startDialogue();
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
initAll(语言);
结果=processNews()
返回结果;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
停止对话();
CallbackReceiver.ReceiveData(结果);
}
}
BTW:调用super.onPostExecute()
和super.onPreExecute()
是没有用的,因为super类中没有默认的实现为什么你没有使用onProgressUpdate来更新进度条?bcs我不是在更新进度,只是显示一个微调器,你能在片段和initAll()中发布showNews()吗在AsyncTask方法中,她是AsyncTask用法的一个很好的例子-你能用例子或任何链接来解释吗?对不起,我没有具体的链接,但是网上有一些关于android后台处理的教程。有趣的答案!由于最终结果是文本的ArrayList,您可以使用非UI线程类型的线程和处理程序吗?我在新闻加载器中看不到太多的UI处理。你当然知道得更清楚。恭喜你@TheOriginalAndroid在my doInBackground()方法中有一个名为processNews()的方法,它从internet获取新闻并返回解析后的xml。因此,异步任务是强制性的。即使有了该作业,它