2017-08-08 37 views
0

我正嘗試在我的應用中使用推送通知。我已完成工作,但現在我需要將已刷新的Firebase標記發送到我自己的服務器,但我不知道如何在活動/片段的上下文之外使用rxjava2/retrofit2方法。我如何訪問它?如何從服務類別調用webserive

我來源:

public class FirebaseInstanceIDService extends FirebaseInstanceIdService { 

    private static final String TAG = "FIIDService"; 

    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     sendRegistrationToServer(refreshedToken); 
    } 

    private void sendRegistrationToServer(String token) { 

     //TODO 

    } 

} 

如果我是在一個活動/片段,我會用下一個電話,但在服務,我不能這樣做。

getCompositeDisposable() 
.add(productManager.getProductList(authToken)) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Consumer<List<Product>>() { 
        @Override 
        public void accept(@NonNull List<Product> products) throws Exception { 
         onProductsLoaded(products); 
        } 
       }, new Consumer<Throwable>() { 
        @Override 
        public void accept(@NonNull Throwable throwable) throws Exception { 
         if (!isViewAttached()) 
          return; 
         getMvpView().hideAlertDialog(); 
         getMvpView().showErrorAlertDialog(); 
        } 
       })); 
+0

我無法理解什麼阻礙您在服務中執行此操作。 –

+0

在「void sendRegistrationToServer(String token)」方法中,我需要使用新的令牌對其餘服務進行調用,以將新令牌存儲在服務器端。但是我不知道如何在沒有活動/片段的情況下進行REST調用。 – MAOL

+0

那麼,我猜REST服務調用不需要Activity/Fragment –

回答

0

要調用REST服務,根本不需要Activity/Fragment上下文。

URL fireBaseUrl = new URL("http://your.service.url"); 
      HttpsURLConnection urlConnection = (HttpsURLConnection) fireBaseUrl.openConnection(); 
      urlConnection.setReadTimeout(10000); 
      urlConnection.addRequestProperty("Content-Type", "application/json"); 
      urlConnection.addRequestProperty("Authorization", "key=" + NetworkUtils.SERVER_KEY); 
      urlConnection.setRequestMethod("POST"); 
      urlConnection.setDoOutput(true); 

      JSONObject notification = new JSONObject() 
        .put("to", "/topics/skm") 
        //.put("to", NetworkUtils.REGISTRATION_TOKEN) 
        .put("data", new JSONObject() 
          .put("latitude", longitude) 
          .put("longitude", latitude)); 

      OutputStreamWriter oStreamWriter = new OutputStreamWriter(urlConnection.getOutputStream(), "UTF-8"); 
      String requestString = notification.toString(); 
      Log.d("JSON REQUEST", requestString); 

      oStreamWriter.write(requestString); 
      oStreamWriter.close(); 

      int status = urlConnection.getResponseCode(); 
      Log.d("STATUS CODE", status + ""); 
0

[解決]

畢竟,我只是爲這個服務創建一個新的compositedisposable和經理。並請求這個對象。我需要使用sharedpreferences來存儲新的推送令牌。

private void sendRegistrationToServer(final String token) { 

     Log.e("FIIS", "sendRegistrationToServer(" + token + ")"); 

     CompositeDisposable compositeDisposable = new CompositeDisposable(); 

     AccountUserManager accountUserManager = new AccountUserManager(); 

     compositeDisposable 
       .add(
         accountUserManager 
           .updatePushToken(getUserAuthToken(), token) 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .subscribe(new Consumer<HttpCustomRes<EmptyModel>>() { 
            @Override 
            public void accept(@NonNull HttpCustomRes<EmptyModel> emptyModelHttpCustomRes) throws Exception { 

             ErrorCode errorCaught = ErrorCode.bypassForErrors(emptyModelHttpCustomRes.getError()); 

             if (errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE)) { 
              Log.e("FIIS", "SUCCESSFUL_RESPONSE"); 
              setUserPushToken(token); 
             } else { 
              Log.e("FIIS", "Unknown Error. Error " + errorCaught.getId()); 
             } 

            } 
           }, new Consumer<Throwable>() { 
            @Override 
            public void accept(@NonNull Throwable throwable) throws Exception { 
             Log.e("FIIS", "Error. " + throwable.getMessage()); 
            } 
           })); 

    } 

    String getUserAuthToken() { 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     if (sharedPreferences.contains(AppConstants.PREF_KEY_USER_AUTH)) { 
      String userAuthString = sharedPreferences.getString(AppConstants.PREF_KEY_USER_AUTH, null); 
      UserAuth userAuth = new Gson().fromJson(userAuthString, UserAuth.class); 

      return userAuth.getToken(); 
     } 

     return null; 

    } 

    void setUserPushToken(String token) { 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     sharedPreferences.edit().putString(token, null).apply(); 

    }