我有一个AsyncTask应该检查网络访问主机名.但是doInBackground()永远不会超时.有人有线索吗?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道以编程方式注册广播接收器的最佳实践/方法是什么.我想根据用户的选择注册特定的接收器.
由于注册是通过清单文件完成的,我想知道是否有一种正确的方法可以在代码中实现这一点.
我在沙箱Android N应用程序中定义了一个接收器:
<receiver
android:exported="true"
android:name="com.sandboxapplication.NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这很简单:
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = NetworkReceiver.class.getName();
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Received Network Change event.");
}
}
Run Code Online (Sandbox Code Playgroud)
如果在我的build.gradle文件中我的targetSdkVersion是23,那么这个接收器工作正常.但是,如果我将targetSdkVersion设置为24,接收器永远不会收到任何东西.事实上,如果我在我的接收器中放置一个调试断点,Android Studio会给我一个视觉指示,看起来它甚至从未加载到内存中.
我是否错过了Android N文档中非常基本的内容?有没有新的方法来检测连接变化事件?
我创建一个WifiP2pGroup使用WifiP2pManager.connect().这样可以正常工作,但无论是否传输数据,该组在30分钟后总是解散.有谁知道为什么会发生这种情况,或者是否可以预防?
我已经尝试在设备之间连续发送数据并使用唤醒锁保持屏幕整个时间,但它没有任何区别.我已经确定wifi设置为不睡觉,并且还获得了一个wifilock,并关闭了应用程序和wifi直接的电池优化,但这些也无济于事.三十分钟后(或具体而言,29米18秒 - 它非常一致)我收到CONNECTION_STATE_CHANGE广播,设备不再配对.
设备是Nexus 7运行Android 7 (LineageOS)和Samsung Galaxy A5运行Android 6.
谢谢!
编辑:我已经尝试关闭移动数据并且未连接wifi.该应用程序没有被暂停或销毁,没有其他应用程序有权更改wifi状态.在其中一台设备上的wifi日志中,我发现此事件在断开连接时:
E/DhcpStateMachine: DHCP renew failed on p2p-wlan0-0: Timed out waiting for DHCP Renew to finish
D/WifiP2pService: GroupCreatedState{ what=196613 }
E/WifiP2pService: DHCP failed
Run Code Online (Sandbox Code Playgroud)
在另一台设备上,我在断开连接过程开始时发现了这个:
552-813/system_process V/WifiHAL: event received NL80211_CMD_DEL_STATION
552-846/system_process D/WifiMonitor: Event [IFNAME=p2p-p2p0-11 AP-STA-DISCONNECTED b6:22:8b:b1:df:0f p2p_dev_addr=f2:62:6f:d1:5f:0c]
552-846/system_process D/WifiMonitor: p2p0 cnt=6442 dispatchEvent: AP-STA-DISCONNECTED b6:22:8b:b1:df:0f p2p_dev_addr=f2:62:6f:d1:5f:0c
552-629/system_process D/WifiP2pService: Client list empty, remove non-persistent p2p group
Run Code Online (Sandbox Code Playgroud) 我在更新API 28的Android应用程序时遇到了registerDefaultNetworkCallback和registerNetworkCallback.
审阅了文档后,我找不到注册网络回调和注册默认 网络回调之间的区别.
什么时候会用哪个?
提前致谢 :)
android network-programming callback android-connectivitymanager
我正在将谷歌文档中的文档加载到我的webview中.我看到的问题是,当用户启动应用程序但未连接到网络时,请看以下屏幕:

现在,如果他连接到网络,在没有重新启动应用程序的情况下,在webview中打开该链接的方法是什么.单击webview中的该链接是一个选项,但是如果发生这种情况,我是否可以提供一些更好的用户友好方式来重新加载webview中的页面?
我已经看到几个BroadcastReciever示例来检测wifi断开连接,但它们似乎都没有正常工作(例如,每个断开连接触发两次)并且没有提到检查ssid,这是否可能?
所以,为了澄清,我想检测与特定ssid的断开连接.在设备上禁用实际断开连接而不禁用wifi.
谢谢
编辑:重新开放作为实在不行就两个,我们就来测试设备.
android ×7
android-connectivitymanager ×1
android-wifi ×1
asynchronous ×1
callback ×1
networking ×1
webview ×1
wifi-direct ×1
wifip2p ×1