2016-09-21 120 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(..)'方法由未知方法異步執行。因此,返回一個字符串(對那個未知的方法)在這裏不會幫助你。 – Robert

回答

1

返回變量的最佳方法是使用一個接口通信的類。

Reference

Java Reference

禰使用eventbus: Eventbus

步驟1.在gradle這個:

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

它是不可能的,如果你重寫一個方法,你承諾返回類型將保持不變,所以你不能。

編輯:剛纔注意到您保存從消息變量值到somekind的日誌文件,請嘗試從另一個功能accesing該日誌文件,並收到消息,可能是最簡單的解決方案。

+0

以及它的android日誌。只是做了檢查我的功能是否正常工作,我不認爲如果我可以從應用程序訪問它。但它給了我一個主意。我可以將數據寫入文件並在需要時讀取它。 – user3923472

-1

結果設置爲全局變量然後訪問該變量。

+0

及其即將用於少數傳感器的方法。我認爲這會造成問題。除非它保持在類內 – user3923472

+0

全局變量不被認爲是一種好的做法,因爲它們使代碼更難理解。而在異步調用的情況下,事情甚至會變得更糟,因爲您必須跟蹤全局變量在另一個線程中何時發生更改。 –

0

不,我們不能返回來自void方法的值。

使用String作爲返回類型,而無效的,這樣就可以收到消息回調用者的方法。

如果該方法被重寫,我們不能改變該方法的返回類型。