服务和界面

时间:2017-02-13 13:08:41

标签: android android-service intentservice

在我的项目中,我是用户Firebase数据库。有了它,我通过以下方式读取数据:

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);
    }

接收者:

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));
            }
        }
    };

1 个答案:

答案 0 :(得分: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);

或者,您可以通过传递 interface 作为参数之一来使用自定义AsyncTask

希望这有帮助。

注意:如果你喜欢,请投票。