0

私は基本的に開発者のトレーニング コース ( Training )のソース コードを使用します。src のようなフラグメントを使用して、動的な UI で RSS フィードを Android に読み込もうとします。そして、MainActivity で新しいスレッドを使用して .XML をフェーズします。ここに私が使用するコードがあります.( code )

データ型を変更します。

    public class RSSData {

//  public static String[] Headlines = new String[20];
    public static List<String> Headlines = new ArrayList<String>();

//  public static String[] Articles = new String[20];
    public static List<String> Articles = new ArrayList<String>();
}

時々うまくいきます。しかし、 headlines_fragment のリスト項目に触れるとクラッシュすることがよくあります。そのため、詳細な記事を読むことができません。

logcat は次のとおりです。

03-16 17:19:43.102: E/InputEventReceiver(12106): Exception dispatching input event.
03-16 17:19:43.102: E/MessageQueue-JNI(12106): Exception in MessageQueue callback: handleReceiveCallback
03-16 17:19:43.132: E/MessageQueue-JNI(12106): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(16908298, class android.widget.ListView) with Adapter(class android.widget.ArrayAdapter)]
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.widget.ListView.layoutChildren(ListView.java:1544)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3953)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.View.dispatchTouchEvent(View.java:7350)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2412)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2147)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2139)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1476)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.app.Activity.dispatchTouchEvent(Activity.java:2487)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2087)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.View.dispatchPointerEvent(View.java:7535)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3415)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3347)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4456)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4434)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4538)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.os.MessageQueue.nativePollOnce(Native Method)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.os.MessageQueue.next(MessageQueue.java:125)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.os.Looper.loop(Looper.java:124)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at android.app.ActivityThread.main(ActivityThread.java:4921)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at java.lang.reflect.Method.invokeNative(Native Method)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at java.lang.reflect.Method.invoke(Method.java:511)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-16 17:19:43.132: E/MessageQueue-JNI(12106):  at dalvik.system.NativeStart.main(Native Method)
03-16 17:19:43.147: D/AndroidRuntime(12106): Shutting down VM
03-16 17:19:43.147: W/dalvikvm(12106): threadid=1: thread exiting with uncaught exception (group=0x41b212a0)
03-16 17:19:43.177: E/AndroidRuntime(12106): FATAL EXCEPTION: main
03-16 17:19:43.177: E/AndroidRuntime(12106): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(16908298, class android.widget.ListView) with Adapter(class android.widget.ArrayAdapter)]
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.widget.ListView.layoutChildren(ListView.java:1544)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3953)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.View.dispatchTouchEvent(View.java:7350)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2412)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2147)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2418)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2161)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2139)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1476)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.app.Activity.dispatchTouchEvent(Activity.java:2487)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2087)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.View.dispatchPointerEvent(View.java:7535)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3415)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3347)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4456)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4434)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4538)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.os.MessageQueue.nativePollOnce(Native Method)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.os.MessageQueue.next(MessageQueue.java:125)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.os.Looper.loop(Looper.java:124)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at android.app.ActivityThread.main(ActivityThread.java:4921)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at java.lang.reflect.Method.invokeNative(Native Method)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at java.lang.reflect.Method.invoke(Method.java:511)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-16 17:19:43.177: E/AndroidRuntime(12106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
4

2 に答える 2

0

おそらく、Main(UI)以外のスレッドからUI要素を更新しています。いつかは機能しますが、常に機能するわけではありません。このリンクを参照してください。別のスレッドからUI要素にアクセスできますか?(設定しないでください)

于 2013-03-16T09:33:17.967 に答える
0

例外は、メイン UI スレッド内にないときにリストを更新しようとしているということです。

Android 3.0 以降、メイン スレッドの外部からネットワーク操作を実行する必要があるため、RSS フィードをバックグラウンド スレッドで解析し、同じスレッドから ListView を更新しようとしているとします。

バックグラウンド スレッドでは、RSS フィードを解析したら、次のようにリストを更新する必要があります。

ArticleListAdapter adapter = new ArticleListAdapter(activityContext, articles);
articleListFrag.setListAdapter(adapter);
adapter.notifyDataSetChanged();

articles解析した新しいリストまたは記事はどこにありactivityContext、ListView が含まれるアクティビティです (これは、が開始されたときに初期化する必要がありますAsyncTask

Android RSS アプリケーションのチュートリアル + コード

私は最近、Android 用の RSS パーサーの作成に関するチュートリアルを作成しました。チェックアウトしたい場合は、すべてのソース コードを GitHub に置いています。RSS を解析し、リスト ビューを更新するバックグラウンド スレッドに関しては、主にこのクラスを参照できます。

于 2013-03-19T22:04:23.047 に答える