同步多个片段的CreateView

时间:2016-04-07 06:11:03

标签: android multithreading android-fragments android-studio async-await

我正在开发一个混合了java和Native代码的Android应用程序。我面临与不同线程数据同步相关的问题。 这是一个场景。

在我的主要活动中,我有一个列表视图。在列表视图中选择一个项目时,我必须创建3个片段,并且我还在本机侧创建了一个模型,它将提供表示各种片段的数据。本机工作的结果将为我提供有关三个片段中的TextView值和按钮状态的一些详细信息。 所以在listview的onclick处理程序中,我创建了一个使用JNI调用在本机端启动的线程t2,在UI线程t1上,我开始创建我的片段。当t2完成时,它将广播本地意图,以便活动知道本机代码已准备好。在处理这个意图时,我必须更新像按钮状态和textview这样的片段的UI。但是我在这里遇到了一个竞争条件,有时候片段的CreateView是完整的,有时候不是。所以我无法在正确处理意图时更新我的​​碎片。

所以我需要一种机制,在处理意图时我等待CreateView完成所有片段然后我可以更新片段的UI。将来我可以再增加1-2个片段。

那么什么是最好的可扩展机制,我可以等待多个Fragment的CreateView完整操作,而不是更新它们。请注意,每个片段彼此独立。

1 个答案:

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

现在,只有在完成后才会对您的片段执行与意图相关的任务

另一种方法是让每个片段单独处理意图,但是,在你的线程中延迟意图广播直到创建所有片段。为此,您可以让您的活动在创建服务时将要创建的片段数传递给服务(执行本机调用等)。现在,只要活动获得片段完成(如前面的示例所示),它就会通知服务,服务会增加计数器。服务延迟广播意图直到达到计数。当然,计数器需要同步以避免竞争条件