gpt4 book ai didi

android - fragment 应如何获得有关异步任务结果的通知?

转载 作者:可可西里 更新时间:2023-11-01 19:06:34 25 4
gpt4 key购买 nike

我有一个使用 fragment 的 Activity 。这些 fragment 可能会根据用户交互来来去去。许多这些 fragment 将作业启动到 IntentService,它以这种方式异步运行。 IntentService 应该如何报告这些作业的结果?

启 Action 业的 fragment 可能不存在。如果一个作业完成并且起始 fragment 当前处于 Activity 状态,那么它应该收到有关此的通知,并采取相应的行动。如果不是,则无需采取任何措施。

我考虑过使用广播 Intent 和 BroadcastReceiver 组件,但 fragment 无法注册接收器,只能注册 Activity 。

您会建议什么解决方案?

最佳答案

我在 IOSched App 中注意到同样的问题(适用于 Android 的 Google I/O 应用程序)。

他们创造了 DetachableResultReceiver ,它扩展了 SDK 类 ResultReciever .

而且他们很容易use it in Fragments .

接收方:

/**
* 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());
}
}
}

Activity 和 fragment :

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

关于android - fragment 应如何获得有关异步任务结果的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6101958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com