Android 如何将异步任务的结果通知片段?
我有一个使用片段的活动。根据用户的交互,这些片段可能会来来去去去。其中许多片段将作业启动到IntentService,IntentService以这种方式异步运行。IntentService应如何报告这些作业的结果 启动作业的片段可能不存在。如果作业完成且起始片段当前处于活动状态,则应通知它,并相应地采取行动。如果不是,那么就不需要采取行动 我考虑过使用广播意图和广播接收器组件,但片段不能注册接收器,只能注册活动Android 如何将异步任务的结果通知片段?,android,android-fragments,android-3.0-honeycomb,Android,Android Fragments,Android 3.0 Honeycomb,我有一个使用片段的活动。根据用户的交互,这些片段可能会来来去去去。其中许多片段将作业启动到IntentService,IntentService以这种方式异步运行。IntentService应如何报告这些作业的结果 启动作业的片段可能不存在。如果作业完成且起始片段当前处于活动状态,则应通知它,并相应地采取行动。如果不是,那么就不需要采取行动 我考虑过使用广播意图和广播接收器组件,但片段不能注册接收器,只能注册活动 您建议什么解决方案?我在(Android版谷歌I/O应用程序)中注意到了同样的问题
您建议什么解决方案?我在(Android版谷歌I/O应用程序)中注意到了同样的问题 他们创建了一个扩展SDK类的 而且他们很容易 接收器:
/**
* Proxy {@link ResultReceiver} that offers a listener interface that can be
* detached. Useful for when sending callbacks to a {@link Service} where a
* listening {@link Activity} can be swapped out during configuration changes.
*/
public class DetachableResultReceiver extends ResultReceiver {
private static final String TAG = "DetachableResultReceiver";
private Receiver mReceiver;
public DetachableResultReceiver(Handler handler) {
super(handler);
}
public void clearReceiver() {
mReceiver = null;
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
} else {
Log.w(TAG, "Dropping result on floor for code " + resultCode + ": "
+ resultData.toString());
}
}
}
public class HomeActivity extends BaseActivity {
private static final String TAG = "HomeActivity";
private SyncStatusUpdaterFragment mSyncStatusUpdaterFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
mTagStreamFragment = (TagStreamFragment) fm.findFragmentById(R.id.fragment_tag_stream);
mSyncStatusUpdaterFragment = (SyncStatusUpdaterFragment) fm
.findFragmentByTag(SyncStatusUpdaterFragment.TAG);
if (mSyncStatusUpdaterFragment == null) {
mSyncStatusUpdaterFragment = new SyncStatusUpdaterFragment();
fm.beginTransaction().add(mSyncStatusUpdaterFragment,
SyncStatusUpdaterFragment.TAG).commit();
triggerRefresh();
}
}
private void triggerRefresh() {
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class);
intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, mSyncStatusUpdaterFragment.mReceiver);
startService(intent);
if (mTagStreamFragment != null) {
mTagStreamFragment.refresh();
}
}
/**
* A non-UI fragment, retained across configuration changes, that updates its activity's UI
* when sync status changes.
*/
public static class SyncStatusUpdaterFragment extends Fragment
implements DetachableResultReceiver.Receiver {
public static final String TAG = SyncStatusUpdaterFragment.class.getName();
private boolean mSyncing = false;
private DetachableResultReceiver mReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
}
/** {@inheritDoc} */
public void onReceiveResult(int resultCode, Bundle resultData) {
HomeActivity activity = (HomeActivity) getActivity();
if (activity == null) {
return;
}
switch (resultCode) {
case SyncService.STATUS_RUNNING: {
mSyncing = true;
break;
}
//...
}
activity.updateRefreshStatus(mSyncing);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((HomeActivity) getActivity()).updateRefreshStatus(mSyncing);
}
}
}
活动和片段:
/**
* Proxy {@link ResultReceiver} that offers a listener interface that can be
* detached. Useful for when sending callbacks to a {@link Service} where a
* listening {@link Activity} can be swapped out during configuration changes.
*/
public class DetachableResultReceiver extends ResultReceiver {
private static final String TAG = "DetachableResultReceiver";
private Receiver mReceiver;
public DetachableResultReceiver(Handler handler) {
super(handler);
}
public void clearReceiver() {
mReceiver = null;
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
} else {
Log.w(TAG, "Dropping result on floor for code " + resultCode + ": "
+ resultData.toString());
}
}
}
public class HomeActivity extends BaseActivity {
private static final String TAG = "HomeActivity";
private SyncStatusUpdaterFragment mSyncStatusUpdaterFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
mTagStreamFragment = (TagStreamFragment) fm.findFragmentById(R.id.fragment_tag_stream);
mSyncStatusUpdaterFragment = (SyncStatusUpdaterFragment) fm
.findFragmentByTag(SyncStatusUpdaterFragment.TAG);
if (mSyncStatusUpdaterFragment == null) {
mSyncStatusUpdaterFragment = new SyncStatusUpdaterFragment();
fm.beginTransaction().add(mSyncStatusUpdaterFragment,
SyncStatusUpdaterFragment.TAG).commit();
triggerRefresh();
}
}
private void triggerRefresh() {
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class);
intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, mSyncStatusUpdaterFragment.mReceiver);
startService(intent);
if (mTagStreamFragment != null) {
mTagStreamFragment.refresh();
}
}
/**
* A non-UI fragment, retained across configuration changes, that updates its activity's UI
* when sync status changes.
*/
public static class SyncStatusUpdaterFragment extends Fragment
implements DetachableResultReceiver.Receiver {
public static final String TAG = SyncStatusUpdaterFragment.class.getName();
private boolean mSyncing = false;
private DetachableResultReceiver mReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
}
/** {@inheritDoc} */
public void onReceiveResult(int resultCode, Bundle resultData) {
HomeActivity activity = (HomeActivity) getActivity();
if (activity == null) {
return;
}
switch (resultCode) {
case SyncService.STATUS_RUNNING: {
mSyncing = true;
break;
}
//...
}
activity.updateRefreshStatus(mSyncing);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((HomeActivity) getActivity()).updateRefreshStatus(mSyncing);
}
}
}
无论出于何种原因,DetachableResultReceiver的链接对我不起作用,如果有人需要它,这是可行的:您能解释一下如何使用它吗?简单地链接到文档和示例并不是一个好的答案。当这些链接衰减时,这个答案几乎毫无用处。请提供您链接到的文档摘要,以改进此答案。生活在前进。链接现在断开了,现在我建议用Otto来解决这个问题-