Java 如何解析来自android服务的rss提要并从该服务更新活动UI?

Java 如何解析来自android服务的rss提要并从该服务更新活动UI?,java,android,xml,parsing,android-activity,Java,Android,Xml,Parsing,Android Activity,我正在构建一个RSSReader应用程序来读取RSS提要并显示我的主要活动中的数据 我使用自定义ListActivity来显示数据。我创建了一个服务来下载xml文件并解析它。我尝试使用序列化将对象的ArrayList发送回MainActivity。但是出现了一个错误,说明服务无法启动 MainActivity.java package com.saivikas.rssreader; import android.content.BroadcastReceiver; import android

我正在构建一个RSSReader应用程序来读取RSS提要并显示我的主要活动中的数据

我使用自定义ListActivity来显示数据。我创建了一个服务来下载xml文件并解析它。我尝试使用序列化将对象的ArrayList发送回MainActivity。但是出现了一个错误,说明服务无法启动

MainActivity.java

package com.saivikas.rssreader;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Iterator;

public class MainActivity extends AppCompatActivity {
    ListView listView;
    MyAdapter adapter;
    String[] titles;
    String[] dates;
    BroadcastReceiver updateUIReceiver;
    public final String ACTION = "com.saivikas.RssReader.MyService";
    public final String KEY = "000";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent serviceIntent = new Intent(this,MyService.class);
        this.startService(serviceIntent);

        IntentFilter filter = new IntentFilter();

        filter.addAction(ACTION);

         updateUIReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                //UI update here
                ArrayList<Entry> entryList = (ArrayList<Entry>) getIntent().getSerializableExtra(KEY);

                Iterator<Entry> it = entryList.iterator();
                int i=0;
                while(it.hasNext()) {
                    Entry currentEntry = it.next();
                    titles[i] = currentEntry.title;
                    dates[i] = currentEntry.pubDate;
                    i++;
                }

                listView = (ListView)findViewById(R.id.list_view);


                int j=0;
                adapter=new MyAdapter(getApplicationContext(),R.layout.row_layout);
                listView.setAdapter(adapter);
                for (String title:titles) {
                    ListDataProvider dataProvider=new ListDataProvider(titles[i],dates[i]);
                    adapter.add(dataProvider);
                    j++;
                }

            }
         };
        registerReceiver(updateUIReceiver, filter);


//        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
//
//
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
//                Toast.makeText(getBaseContext(), position + "is selected", Toast.LENGTH_SHORT).show();
//                Intent myIntent = new Intent(view.getContext(), second_class.class);
//                startActivity(myIntent);
//            }
//        });
    }


}
错误:

08-30 16:54:27.628    2917-2917/com.saivikas.rssreader E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start service com.saivikas.rssreader.MyService@420df0b8 with Intent { cmp=com.saivikas.rssreader/.MyService }: java.lang.IllegalArgumentException: is == null
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2859)
            at android.app.ActivityThread.access$1900(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1461)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5392)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: is == null
            at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1615)
            at com.saivikas.rssreader.MyService.onStartCommand(MyService.java:45)
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2842)
            at android.app.ActivityThread.access$1900(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1461)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5392)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)

您遇到的问题似乎是KXmlParser类中的一个运行时异常,由于无法启动服务,该异常在您的服务中生成了一个illegalStateException。看看MyService第45行的调用,它调用了KXmlParser类,并在第1615行崩溃。因为名称看起来像InputStream是null或类似的东西

我的两分钱: 使用一个服务就像用坦克杀死苍蝇一样。 非主线程作业的公认规则大致如下: 如果重新请求/工作/作业可以在2-3秒内完成,请不要使用服务

一个服务应该用于下载大文件或图像,应该在应用程序关闭时完成的特殊工作。。。或者类似的东西

尝试使用异步任务,而不是使用服务 它并不完美,也有局限性,可能有人会特别告诉你,当用户打开设备时,Android会重新创建布局,但它是开始学习Android的完美选择。
对于请求API和RESTAPI,我建议您查看改装库。因为这个XML解析器要复杂一些,因为您需要一个自定义的解析器,但请尝试一下。

AsyncTask非常有效。非常感谢阿拉塞姆。我的代码变得更简单了。@Vikas请选择正确的答案,就像在勾选和向上投票中单击一样。如果可以的话,我想你不能用你的实际分数
import java.io.Serializable;


    public class Entry implements Serializable {
        public String title;
        public String pubDate;
    }
08-30 16:54:27.628    2917-2917/com.saivikas.rssreader E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start service com.saivikas.rssreader.MyService@420df0b8 with Intent { cmp=com.saivikas.rssreader/.MyService }: java.lang.IllegalArgumentException: is == null
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2859)
            at android.app.ActivityThread.access$1900(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1461)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5392)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: is == null
            at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1615)
            at com.saivikas.rssreader.MyService.onStartCommand(MyService.java:45)
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2842)
            at android.app.ActivityThread.access$1900(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1461)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5392)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)