2017-02-13 73 views
1

在我的項目中,我是用戶的Firebase數據庫。有了它,我讀出的數據frmo分貝以下方式:服務和界面

public void getSoftwareRecords() { 
     final List<Software> softwareList = new ArrayList<>(); 
     databaseReference = firebaseDatabase.getReference("software"); 
     getSoftwareRecordsListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        softwareList.add(snapshot.getValue(Software.class)); 
       } 
       Log.d(TAG, "Software from server count: " + softwareList.size()); 
       onSoftwareTransactionListener.onSuccessSyncListOfSoftware(softwareList); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.e(TAG, "Cant read software list from database: " + databaseError.getDetails()); 
       // TODO describe error #102 for documentation 
       onSoftwareTransactionListener.onFailureSyncListOfSoftware("Ohh."); 
      } 
     }; 
     databaseReference.addValueEventListener(getSoftwareRecordsListener); 

後,這個方法我想在IntentService打電話。你注意到,沒有返回值= void。所以,問題是我可以如何將用戶服務和界面結合在一起?

服務(因爲我想用它):

public class ReadSoftwareListService extends IntentService implements Database.OnSoftwareTransactionListener { 
    private static final String TAG = ReadSoftwareListService.class.getSimpleName(); 
    public static final String ACTION = "..."; 
    public static final String RESULT_CODE = "RESULT_CODE"; 
    public static final String RESULT_VALUE = "RESULT_VALUE"; 

    private Intent in; 

    public ReadSoftwareListService() { 
     super("ReadSoftwareListService"); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     in = new Intent(ACTION); 
     Log.d(TAG, "ReadSoftwareListService:: onHandleIntent"); 
     Database database = new Database(com.google.firebase.database.FirebaseDatabase.getInstance()); 
     database.getSoftwareRecords(); // <- this is a method from code above. 

    } 

    @Override 
    public void onSuccessSyncListOfSoftware(List<Software> softwareList) { 
     Log.d(TAG, "ReadSoftwareListService:: onSuccessSyncListOfSoftware"); 
     Bundle bundle = new Bundle(); 
     bundle.putInt(RESULT_CODE, Activity.RESULT_OK); 
     in.putExtras(bundle); 
     // bundle.putSerializable(RESULT_VALUE, softwareList); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(in); 
    } 

    @Override 
    public void onFailureSyncListOfSoftware(String message) { 
     Log.d(TAG, "ReadSoftwareListService:: onFailureSyncListOfSoftware"); 
     Bundle bundle = new Bundle(); 
     bundle.putInt(RESULT_CODE, Activity.RESULT_CANCELED); 
     bundle.putString(RESULT_VALUE, message); 
     in.putExtras(bundle); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(in); 
    } 

而且reciever:

public final BroadcastReceiver softwareListReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG, "softwareListReceiver:: onReceive"); 
      Bundle bundle = intent.getExtras(); 
      int resultCode = bundle.getInt(RESULT_CODE); 
      if (resultCode == Activity.RESULT_OK) { 
       Log.d(TAG, "RESULT CODE == OK"); 

//    softwareListAdapter.updateData(bundle.getParcelableArrayList(RESULT_VALUE)); 
      } else { 
       Log.d(TAG, "RESULT CODE == CANCEL: " + bundle.getString(RESULT_VALUE)); 
      } 
     } 
    }; 

回答

0

如果你真的想在這裏使用IntentService,你可以去添加ResultReceiver作爲回調。例如: -

Intent intentService = new Intent(context, YourIntentService.class); 
intentService.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) { 
    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     if (resultCode == StockService.RESULT_ID_QUOTE) { 
      ... 
     } 
    } 
}); 
startService(intentService); 

或者你可以通過接口作爲一個參數使用自定義的AsyncTask

希望這會有所幫助。

注意:如果你喜歡這個,請投票。