2016-09-21 8 views
1

私はJavaの新機能を持ち、テストプロジェクトで問題が発生しました。
voidメソッドからどのように値を返すことができますか?私は、タイトルを変更した場合、私はこのエラーが表示されます。
はここに「互換性のない戻り値の型を使用しようとするが、」コード文字列が上書きされたクラスを返す

public void show_sensor (Context appcontext, int sensortype){ 

    new ReactiveSensors(appcontext).observeSensor(sensortype) 
      .subscribeOn(Schedulers.computation()) 
      .filter(ReactiveSensorFilter.filterSensorChanged()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<ReactiveSensorEvent>() { 
       @Override 
       public void call(ReactiveSensorEvent reactiveSensorEvent) { 
        SensorEvent event = reactiveSensorEvent.getSensorEvent(); 

        float x = event.values[0]; 
        float y = event.values[1]; 
        float z = event.values[2]; 

        String message = String.format("x = %f, y = %f, z = %f", x, y, z); 

        Log.d("gyroscope readings", message); 
       } 
      }); 
} 

である私は、「メッセージ」を返すようにしたい私はこれを行うことができます任意の方法はありますか?
また、アプリケーションコンテキストを取得する際に問題が発生するため、渡す必要がありました。クラス内からApplicationContextを取得して、バックグラウンドで実行できるかどうかを確認する必要があります。
(私はブロードキャストを設定したい、受信機クラスで "getApplicationContext()"を使用することはできません)

+4

できません。メソッドをオーバーライドする場合、返される型は同じでなければなりません。 – jhamon

+0

'call(..) 'メソッドは、未知のメソッドで非同期に実行されます。したがって、その未知のメソッドにStringを返すことはあなたをここで助けません。 – Robert

答えて

1

変数を返す最も良い方法は、インターフェイスを使用してクラスを伝達することです。

Reference

Java Reference

Thyの使用eventbus:のGradleで Eventbus

ステップ1:

compile 'org.greenrobot:eventbus:3.0.0' 

ステップ2.メッセージ定義

public class MessageEvent { 

public final String message; 

public MessageEvent(String message) { 
    this.message = message; 
    } 
} 

ステップ3:加入者を準備します。

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(MessageEvent event) { 
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); 
} 

ステップ4:加入者

@Override 
public void onStart() { 
    super.onStart(); 
    EventBus.getDefault().register(this); 
} 

@Override 
public void onStop() { 
    EventBus.getDefault().unregister(this); 
    super.onStop(); 
} 

を登録し最終ステップ:ディスパッチイベント:

String message = String.format("x = %f, y = %f, z = %f", x, y, z); 
EventBus.getDefault().post(new MessageEvent (message)); 
Log.d("gyroscope readings", message); 
+0

あなたはもっと説明できますか? Javaの新しい種類です。その唯一の答えはあなたがすることができないし、意味をなさない。 – user3923472

+0

私は新しいリファレンスで私の答えを編集しました。それを試してみるか、あなたのクラスの全てを質問に投稿してください。 –

+0

ありがとうございます。私はこのライブラリ[リンク](https://github.com/pwittchen/ReactiveSensors)を使用して私のアプリの他の部分はこれに無関係です。私はあなたの新しいリファレンスを今読んでいます。 – user3923472

3

戻り値の型が同じであると約束しているメソッドをオーバーライドすると不可能です。 。

EDIT:メッセージ変数の値をログファイルのsomekindに保存していて、別の関数からログファイルにアクセスしてメッセージを取得しようとすると、最も簡単な解決策になるかもしれません。

+0

もそのアンドロイドログです。ちょうど私の機能が正しく働いているかどうかをチェックするために、私はアプリからそれにアクセスできるとは思わない。それは私にアイデアを与えた。私はファイルにデータを書き込んで、いつでもそれを読むことができます。 – user3923472

-1

結果をグローバル変数に設定し、その変数にアクセスします。

+0

よく、それは少数のセンサーのために使う方法です。私はそれが問題を引き起こすと思う。クラス内に収まらない限り – user3923472

+0

グローバル変数はコードを理解しにくくするため、良い方法とはみなされません。非同期呼び出しの場合、グローバル変数が別のスレッドでいつ変更されたかを追跡する必要があるため、状況はさらに悪化します。 –

0

ありません、我々は返すことはできませんがvoidメソッドの値。

戻り値の型として文字列を使用してください。これにより、呼び出し元メソッドにメッセージを戻すことができます。

メソッドがオーバーライドされた場合、そのメソッドの戻り値の型を変更することはできません。

関連する問題