
我的活动连接到onStart()中的Googleapiclient,并在onStop()中断开连接
该活动使用GrIDVIEwPager来显示我的片段.要通过数据层发送消息,我使用活动和片段之间的回调接口.
如果我从Activity布局中的按钮调用sendMessage(),它可以正常工作.如果片段使用回调接口执行sendMessage(),则sendMessage()显示“未连接”Toast.
在两种方式中,调用Activity中的相同方法,那么它的行为可能有何不同?
我应该提一下,问题只会在第一次重启应用程序后出现.
活动
public class WearPlex extends WearableActivity implements NavigationRemoteCallbacks,Googleapiclient.ConnectionCallbacks,Googleapiclient.OnConnectionFailedListener {private List<Node> nodeList = new ArrayList<Node>();private List<Fragment> fragmentList = new ArrayList<Fragment>();private Googleapiclient Googleapiclient;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_wear_plex); setAmbIEntEnabled(); fragmentList.add(NavigationRemoteFragment.getInstance(this)); GrIDVIEwPager mGrIDPager = (GrIDVIEwPager)findVIEwByID(R.ID.grIDVIEwPager); mGrIDPager.setAdapter(new MainGrIDPageAdapter(getFragmentManager(),fragmentList)); Googleapiclient = new Googleapiclient.Builder(this) .addAPI(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();}@OverrIDeprotected voID onStart() { super.onStart(); Googleapiclient.connect();}@OverrIDeprotected voID onStop() { Googleapiclient.disconnect(); super.onStop();}@OverrIDepublic voID onConnected(Bundle bundle) { Toast.makeText(this,"Connected",Toast.LENGTH_SHORT).show(); nodeList.clear(); Wearable.NodeAPI.getConnectednodes(Googleapiclient).setResultCallback(new ResultCallback<NodeAPI.GetConnectednodesResult>() { @OverrIDe public voID onResult(NodeAPI.GetConnectednodesResult nodes) { for (Node node : nodes.getNodes()) nodeList.add(node); } });}@OverrIDepublic voID navigationRemoteSendCommand(String commandpath) { sendMessage(commandpath,null);}public voID deBUGOnClick(VIEw vIEw) { sendMessage("/deBUG",null);}public voID sendMessage(String path,byte[] data) { if (Googleapiclient.isConnected()) { for (int i = 0; i < nodeList.size(); i++) { if (nodeList.get(i).isNearby()) { Toast.makeText(this,"Send message",Toast.LENGTH_SHORT).show(); Wearable.MessageAPI.sendMessage(Googleapiclient,nodeList.get(i).getID(),path,data); } } } else { Toast.makeText(this,"Not connected",Toast.LENGTH_SHORT).show(); }}@OverrIDepublic voID onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(this,"Connection Failed",Toast.LENGTH_SHORT).show();} 分段
public class NavigationRemoteFragment extends Fragment {private static NavigationRemoteFragment navigationRemoteFragment = null;private NavigationRemoteCallbacks callbackHandler = null;private Imagebutton navBtnCenter;public static NavigationRemoteFragment getInstance(NavigationRemoteCallbacks handler) { if (navigationRemoteFragment == null) { navigationRemoteFragment = new NavigationRemoteFragment(); navigationRemoteFragment.callbackHandler = handler; } return navigationRemoteFragment;}public NavigationRemoteFragment() { // required empty public constructor}@OverrIDepublic voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);}@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment VIEw v = inflater.inflate(R.layout.fragment_navigation_remote,container,false); navBtnCenter = (Imagebutton)v.findVIEwByID(R.ID.navBtnCenter); navBtnCenter.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { callbackHandler.navigationRemoteSendCommand("/deBUG"); } }); return v;} }
回调接口
public interface NavigationRemoteCallbacks { public voID navigationRemoteSendCommand(String commandpath);} 编辑MainGrIDPageAdapter的1代码
public class MainGrIDPageAdapter extends FragmentGrIDPagerAdapter {private List<Fragment> fragmentList = null;public MainGrIDPageAdapter(FragmentManager fm,List<Fragment> fragmentList) { super(fm); this.fragmentList = fragmentList;}@OverrIDepublic Fragment getFragment(int i,int i1) { if (i1 < fragmentList.size()) return fragmentList.get(i1); return null;}@OverrIDepublic int getRowCount() { return 1;}@OverrIDepublic int getColumnCount(int i) { return fragmentList.size();}解决方法 您没有显示MainGrIDPageAdapter的代码,因此我不知道它是如何管理片段的.您提到重启后问题就出现了.查看WearPlex.onCreate()中的代码,我怀疑问题是由于片段持有对旧的,被破坏的活动实例的引用. FragmentManager的一个记录不良的行为是它在重新启动时保存其状态.这经常被忽略,导致重启后重复的片段实例.在主机活动的onCreate()方法中管理片段创建的正确模式是:
if (savedInstanceState == null) { // Not a restart // Create a new instance of the fragment // Add it to the fragment manager } else { // Restart // The fragment manager has saved and restored the fragment instances // Use findFragmentByID() to get the fragment if you need it } 您没有在onCreate()中使用savedInstanceState来测试重启.重启后,您是否看到了比预期更多的碎片?如果是这样,原始片段将保留对旧活动的引用,该活动已停止,并且具有断开连接的Googleapiclient.如果单击其中一个片段的NavBtn,您将看到“未连接”的吐司.
更新
问题是由您创建NavigationRemoteFragment的新实例的方式引起的,特别是使用静态成员navigationRemoteFragment.重新启动后,重新创建活动时,代码会调用NavigationRemoteFragment.getInstance(this). getInstance()发现navigationRemoteFragment不为null,因为它是静态的,并且不会创建新的片段.返回的片段是旧片段,它保存对旧活动的引用,该活动已停止且具有断开连接的Googleapiclient.
这可以通过使用isDestroyed方法并添加一些调试日志记录来确认:
@OverrIDepublic voID navigationRemoteSendCommand(String commandpath) { if (isDestroyed()) { Log.w("TEST","This is an old instance of the activity"); } sendMessage(commandpath,null);} 总结 以上是内存溢出为你收集整理的android – 如果从片段中使用,则GoogleApiClient未连接全部内容,希望文章能够帮你解决android – 如果从片段中使用,则GoogleApiClient未连接所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)