【问题标题】:Using Service to carry out operation - asynchronous tasks使用Service进行操作——异步任务
【发布时间】:2015-03-03 19:57:48
【问题描述】:

我在我创建的库模块中设置了绑定服务。

如果这不是库模块,我的问题会很简单,因为我需要对其他人来说是动态的。

当前应用程序使用库模块通过 Wifi-Direct 在两部手机之间搜索和创建连接(目前没有问题)。

我的问题现在是我的应用程序(我正在测试它以确保库模块没有丢失任何东西)不知道两部手机何时“连接”。

我尝试了一个while循环来不断请求内容并循环直到它不为空,这在技术上可行吗?但是我没有运气。

我正在考虑实现一个等待功能,但这是最后的手段!

我正在使用 android 指南来创建我的库 Link


实际问题

我正在尝试获取有关连接的信息以显示给用户,显然如果尚未建立连接,它将为空!从而引起我的问​​题。

我发现的一个解决方案是逐步执行并手动等待,直到另一部手机接受连接并成功连接,然后继续请求信息等。

如果有任何问题,请告诉我,因为我知道这很令人困惑!

【问题讨论】:

    标签: android android-wifi android-library


    【解决方案1】:

    更新:当您的库检测到成功的 P2P 连接时,您将希望在库中使用 sendBroadcast() 向您的应用发送意图。仅当当前打开 Activity 时,您可能希望在您的应用程序中接收意图。请参阅下面的新代码:

    看到这是在建立 P2P 连接的情况下添加的,请注意您应该将 com.yourapp.example 替换为您的包名称:

      Intent i = new Intent("com.yourapp.example.P2PCONNECTED");
      context.sendBroadcast(i);
    

    在您的库中定义 BroadcastReceiver 的代码:

        WiFiDirectFilter = new IntentFilter(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        WiFiDirectFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        WiFiDirectFilterBroadcastReceiver = new BroadcastReceiver() {            
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
    
               Log.i("MyApp", action);
    
                if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                    int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);   
    
                        if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {   
                            Log.i("MyApp", "WifiDirect WIFI_P2P_STATE_CHANGED_ACTION Enabled: true");
                            //WiFi Direct Enabled
                            //Do something....
                        } 
                        else { 
                            Log.i("MyApp", "WifiDirect WIFI_P2P_STATE_CHANGED_ACTION Enabled: false");
                            //WiFi Direct not enabled...
                            //Do something.....
                        }
    
                }
                else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                       NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);   
    
                        if(networkInfo != null) {
                            boolean isWiFiDirectConnected = networkInfo.isConnected();
                            Log.i("MyApp", "WifiDirect WIFI_P2P_CONNECTION_CHANGED_ACTION Connected: " + );
                            if (isWiFiDirectConnected){
                               //WiFi Direct connected!
                               //Send Broadcast to your app
                               Intent i = new Intent("com.yourapp.example.P2PCONNECTED");
                               context.sendBroadcast(i);
                            }
                            else{
                               //WiFi Direct not connected
                               //Do something
    
                            }
                        }
    
                }
            }
        };
    

    然后在您应用中的任何活动或片段中,您可能希望在 onResume() 中注册并在 onPause() 中取消注册,请参见以下代码:

     @Override
    public void onResume() {
        super.onResume();
        IntentFilter iFilter= new IntentFilter("com.yourapp.example.P2PCONNECTED");
        //iFilter.addAction("someOtherAction"); //if you want to add other actions to filter
        this.registerReceiver(br, iFilter);
    }
    
    @Override
    public void onPause() {
        this.unregisterReceiver(br);
        super.onPause();
    }
    
    private BroadcastReceiver br = new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals("com.yourapp.example.P2PCONNECTED")){
                 this.runOnUiThread(mUpdateP2PStatus);
            }
        }
    
    };
    
    private final Runnable mUpdateP2PStatus= new Runnable() {
    
        @Override
        public void run() {
          //TODO: Update your UI here                        
        }
    };
    

    【讨论】:

    • 是的,这是正确的,我已经在我的库中实现了这个,问题是如何动态回调?让用户知道连接成功
    • 啊,好的。您可能希望从您的库中发送您自己的广播,并在您的应用程序中使用广播接收器来接收它们。看到这个帖子:stackoverflow.com/questions/15634062/…
    • 您好,再次抱歉,现在才有时间看这个,这就是我正在寻找的答案,但我不知道具体要实施什么......听起来我要保持我的主要广播接收器并在我使用的每个活动中重新注册?肯定不是?或者我是否为每个活动创建另一个广播接收器来接听这些呼叫?另请注意,我使用绑定的服务和片段!
    • 您好,我用我认为的工作方式更新了答案。我没有使用库/应用程序场景对此进行测试,因此您可能需要进行修改,但希望它能让您走上正轨。
    • 是的,这将做 atm 但是我遇到了一个问题,因为我正在扩展片段,我无法扩展 BroadcastReceiver... 有什么建议吗?我如何实现接口,因为这是我找到的唯一解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2016-02-09
    • 2018-01-20
    • 2019-12-12
    相关资源
    最近更新 更多