我必须将UDP数据包发送到没有互联网连接的WiFi模块(提供自己的AP)但是当我将移动设备连接到AP时,Android会重定向移动数据接口上的数据包,因为它已经连接了互联网.
我已经使用下面的代码来完成我的工作,但它似乎不适用于Android M.
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setWifiInterfaceAsDefault() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest networkRequest= builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback());
}
Run Code Online (Sandbox Code Playgroud)
我还补充道
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
在我的AndroidManifest.xml上,我确保自己Settings.System.canWrite(this)返回true但仍然没有.
提前致谢.
我打算发一个问题,但提前想出来并决定发布问题和答案 - 或者至少我的意见.
当使用匿名委托作为WaitCallback时,在foreach循环中调用ThreadPool.QueueUserWorkItem时,似乎将相同的一个foreach-value传递到每个线程.
List< Thing > things = MyDb.GetTheThings();
foreach( Thing t in Things)
{
localLogger.DebugFormat( "About to queue thing [{0}].", t.Id );
ThreadPool.QueueUserWorkItem(
delegate()
{
try
{
WorkWithOneThing( t );
}
finally
{
Cleanup();
localLogger.DebugFormat("Thing [{0}] has been queued and run by the delegate.", t.Id );
}
});
}
Run Code Online (Sandbox Code Playgroud)
对于事物中的16个Thing实例的集合,我观察到传递给WorkWithOneThing的每个'Thing'对应于'things'列表中的最后一个项目.
我怀疑这是因为委托正在访问't'外部变量.请注意,我还尝试将Thing作为参数传递给匿名委托,但行为仍然不正确.
当我重新考虑代码以使用命名的WaitCallback方法并将Thing't'传递给方法时,瞧......事物的第一个实例被正确地传递给了WorkWithOneThing.
我想是平行学的一课.我还想象Parallel.For系列解决了这个问题,但是这个库不是我们的选择.
希望这能节省一些时间.
霍华德霍夫曼