android – 如果从片段中使用,则GoogleApiClient未连接

android – 如果从片段中使用,则GoogleApiClient未连接,第1张

概述我今天发现了一种奇怪的行为. 我的活动连接到onStart()中的GoogleApiClient,并在onStop()中断开连接 该活动使用GridViewPager来显示我的片段.要通过数据层发送消息,我使用活动和片段之间的回调接口. 如果我从Activity布局中的按钮调用sendMessage(),它可以正常工作.如果片段使用回调接口执行sendMessage(),则sendMessage( 我今天发现了一种奇怪的行为.

我的活动连接到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未连接所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125654.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存