5

RxAndroid と を使用.observeOn(AndroidSchedulers.mainThread())し、Android Studio を使用してエミュレーターでテストを実行すると、テスト実行全体が次のようにクラッシュします。

java.lang.NoSuchMethodError' 'が原因でインストルメンテーションの実行に失敗しました

次のようにlogcat出力されます。

FATAL EXCEPTION: main
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
       at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:54)
       at android.os.Handler.handleCallback(Handler.java:587)
       at android.os.Handler.dispatchMessage(Handler.java:92)
       at android.os.Looper.loop(Looper.java:123)
       at android.app.ActivityThread.main(ActivityThread.java:4627)
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:521)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
       at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoSuchMethodError: rx.internal.schedulers.ScheduledAction.lazySet
       at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:46)
       ... 9 more
Error in app net.tbmcv.rxtest running instrumentation ComponentInfo{net.tbmcv.rxtest.test/android.test.InstrumentationTestRunner}:
  java.lang.NoSuchMethodError
  java.lang.NoSuchMethodError: rx.internal.schedulers.ScheduledAction.lazySet
Force stopping package net.tbmcv.rxtest uid=10042

Android Studio もlogcat出力も、プロジェクトまたはテストのコード行について言及していません。このクラッシュを再現するために作成した短いサンプル プロジェクトの関連部分を次に示します。

app/build.gradle

dependencies {
    compile 'io.reactivex:rxandroid:0.24.0'
}

MainActivity.java

public class MainActivity extends Activity {
    public void setTitleFrom(Observable<String> observable) {
        observable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        setTitle(s);
                    }
                });
    }
}

MainActivityFuncTest.java

public class MainActivityFuncTest extends ActivityInstrumentationTestCase2<MainActivity> {
    public void testSetTitle() {
        final String newTitle = "Hello World";
        getActivity().setTitleFrom(Observable.just(newTitle));
        getInstrumentation().waitForIdleSync();
        assertEquals(newTitle, getActivity().getTitle());
    }
}

MainActivityコードを使用しないように変更すると、テストが正しく実行されobserveOn()ます。

public void setTitleFrom(Observable<String> observable) {
    observable.subscribe(new Action1<String>() {
        @Override
        public void call(final String s) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    setTitle(s);
                }
            });
        }
    });
}

observeOn()しかし、よりクリーンでモジュール化されているため、私はむしろ を使用したいと思います。テストを実行するにはどうすればよいですか?

私のエミュレータは API バージョン 8 (Android 2.2) を実行しています。

4

1 に答える 1

0

RxJava の GitHub ページによると、RxJava バージョン 1.0.x は Android 2.3 以降 (API 9 以降に対応) でのみ動作します。もちろん、RxAndroid は RxJava に依存しているため、同じ制限が適用されます (現在 RxAndroid ページには記載されていませんが)。

上記のテストは、最新バージョンの Android を実行しているエミュレーターで正常に実行されます。

于 2015-06-24T12:19:24.827 に答える