Java 如何解析来自android服务的rss提要并从该服务更新活动UI?
我正在构建一个RSSReader应用程序来读取RSS提要并显示我的主要活动中的数据 我使用自定义ListActivity来显示数据。我创建了一个服务来下载xml文件并解析它。我尝试使用序列化将对象的ArrayList发送回MainActivity。但是出现了一个错误,说明服务无法启动 MainActivity.javaJava 如何解析来自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
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)