Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回类型为的异步任务操作_Java_Android_Android Fragments_Android Asynctask - Fatal编程技术网

Java 返回类型为的异步任务操作

Java 返回类型为的异步任务操作,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,我是android开发新手,作为我学习的一部分,我正在制作一个多语言新闻阅读器应用程序,该应用程序从谷歌新闻获取rss提要并解析 为此,我使用选项卡式视图来显示多种语言,用户可以在不同的语言中滑动。应用程序包含印地语、马来语、英语和泰米尔语标签,所有标签都列出了特定的新闻项目 每个语言视图页都是独立的片段。应用程序中总共有四个片段,主要活动包含所有这些片段 对于所有这些片段,我有一个AsyncTask扩展类,它从服务器加载和解析新闻,并在其doInBackground方法上返回一个数组列表,但问

我是android开发新手,作为我学习的一部分,我正在制作一个多语言新闻阅读器应用程序,该应用程序从谷歌新闻获取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;
        }
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
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。因此,异步任务是强制性的。即使有了该作业,它