我正在开发一个混合了java和Native代码的Android应用程序。我面临与不同线程数据同步相关的问题。 这是一个场景。
在我的主要活动中,我有一个列表视图。在列表视图中选择一个项目时,我必须创建3个片段,并且我还在本机侧创建了一个模型,它将提供表示各种片段的数据。本机工作的结果将为我提供有关三个片段中的TextView值和按钮状态的一些详细信息。 所以在listview的onclick处理程序中,我创建了一个使用JNI调用在本机端启动的线程t2,在UI线程t1上,我开始创建我的片段。当t2完成时,它将广播本地意图,以便活动知道本机代码已准备好。在处理这个意图时,我必须更新像按钮状态和textview这样的片段的UI。但是我在这里遇到了一个竞争条件,有时候片段的CreateView是完整的,有时候不是。所以我无法在正确处理意图时更新我的碎片。
所以我需要一种机制,在处理意图时我等待CreateView完成所有片段然后我可以更新片段的UI。将来我可以再增加1-2个片段。
那么什么是最好的可扩展机制,我可以等待多个Fragment的CreateView完整操作,而不是更新它们。请注意,每个片段彼此独立。
答案 0 :(得分:0)
如果我理解你的问题,你基本上需要一种方法让你的活动知道是否所有片段都是用createview完成的,然后处理意图。
一个相对简单的方法是创建一个简单的接口FragmentCallBack,MainActivity可以使用它来跟踪已创建的所有片段
public Interface FragmentCallBack {
public void onFragmentCreated(Fragment f)
}
让您的活动实现此接口,其中可以跟踪创建的片段。同样在Activity中有一个变量来存储接收到的意图,一个布尔值来跟踪是否接收到意图
private Intent recievedIntent
private boolean isIntentRecieved
List<Fragment> createdFragments
现在实现处理片段完成和意图接收的函数
@Override
public void onFragmentCreated(Fragment f) {
createdFragments.add(f)
if (isIntentRecieved) {
//handle the intent for this fragment
}
}
@Override
public void onRecieve(Context context, Intent intent) {
isIntentRecieved = true
recievedIntent = intent
for (Fragment f: createdFragments) {
//handle the intent
}
}
现在,片段所需的更改将通知createView完成的活动
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//do createview stuff
((FragmentCallback) (getActivity())).onFragmentCreated(this);
}
现在,只有在完成后才会对您的片段执行与意图相关的任务
另一种方法是让每个片段单独处理意图,但是,在你的线程中延迟意图广播直到创建所有片段。为此,您可以让您的活动在创建服务时将要创建的片段数传递给服务(执行本机调用等)。现在,只要活动获得片段完成(如前面的示例所示),它就会通知服务,服务会增加计数器。服务延迟广播意图直到达到计数。当然,计数器需要同步以避免竞争条件