Java 从Android中的单独AsyncTask类连接WiFi管理器
我有一个应用程序,它使用Java 从Android中的单独AsyncTask类连接WiFi管理器,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个应用程序,它使用AsyncTask通过WifiManager连接到WiFi 现在,我在我的main活动中使用它作为 public class connectWifi extends AsyncTask<Void, Void, Void> { private ProgressDialog dialog; public connectWifi(MyActivity activity) { dialog = new ProgressDialog(a
AsyncTask
通过WifiManager
连接到WiFi
现在,我在我的main活动中使用它作为
public class connectWifi extends AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;
public connectWifi(MyActivity activity) {
dialog = new ProgressDialog(activity);
}
@Override
protected void onPreExecute() {
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Connecting to WiFi. Please Wait.");
dialog.show();
}
@Override
protected void onPostExecute(Void result) {
connected = true;
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo conn = wifi.getConnectionInfo();
Context context = getApplicationContext();
CharSequence wifi_on = "Connected to " + conn.getSSID();
int duration = Toast.LENGTH_LONG;
Toast responseToast = Toast.makeText(context, wifi_on, duration);
responseToast.show();
if (dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected Void doInBackground(Void... voids) {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);
try {
Thread.sleep(3000);
} catch (Exception e) {
}
return null;
}
}
公共类连接任务{
私人对话;
公共连接WiFi(我的活动){
dialog=新建进度对话框(活动);
}
@凌驾
受保护的void onPreExecute(){
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
setProgressStyle(ProgressDialog.STYLE_微调器);
设置消息(“连接到WiFi,请稍候”);
dialog.show();
}
@凌驾
受保护的void onPostExecute(void结果){
连接=真;
WifiManager wifi=(WifiManager)getSystemService(Context.wifi\u SERVICE);
WifiInfo conn=wifi.getConnectionInfo();
Context=getApplicationContext();
CharSequence wifi_on=“连接到”+conn.getSSID();
int duration=Toast.LENGTH\u LONG;
Toast responseToast=Toast.makeText(上下文、wifi打开、持续时间);
responseToast.show();
if(dialog.isShowing()){
dialog.dismise();
}
}
@凌驾
受保护的空位背景(空位…空位){
WifiManager wifi=(WifiManager)getSystemService(Context.wifi\u SERVICE);
wifi.setWifiEnabled(true);
试一试{
睡眠(3000);
}捕获(例外e){
}
返回null;
}
}
现在,我有另一个类AlarmReceiver
,它通过广播
调用。我正在课堂上执行一些基于网络的操作,需要我先连接到WiFi。
如何为connectWifi
创建一个单独的类,而不需要首先运行main活动
?
我面临的问题是创建上下文
对象,该对象表示非静态的“getApplicationContext()”不能从静态上下文引用。
getSystemService()
也存在同样的问题。如何根据需要创建此类
abc
是AsyncTask
类。
AlarmReceiver
是BroadcastReceiver
我目前的控制流程如下:
启动程序
-AlarmManager
接收广播
-AlarmManager
在abc
中调用启用WiFi()
-启用WiFi()
连接到WiFi
-AlarmManager
检查连接状态
-AlarmManager
然后调用new abc()。执行(“数据1”)
-abc
然后执行doInBackground
任务(网络请求)
-AlarmManager
在abc
中调用禁用WiFi()
以结束WiFi
结束过程您可以根据上下文
创建一个单独的类。活动
和广播接收器
都可以为此类提供上下文
活动
是上下文
的子类,因此可以将活动
作为参数传递。
来自BroadcastReceiver
的onReceive
的第一个参数是上下文
因此,您可以使用WifiManager
创建一个接收上下文
实例的类:
// This can run outside UI Thread
public static void enableWifi(Context context) {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);
}
// This must run on UI Thread
public static void verifyWifi(Context context) {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo conn = wifi.getConnectionInfo();
CharSequence wifi_on = "Connected to " + conn.getSSID();
int duration = Toast.LENGTH_LONG;
Toast.makeText(context, wifi_on, duration).show();
}
您可以使用此类来检测何时启用Wifi
,或更改其状态
public class NetworkChangeReceiver extends BroadcastReceiver {
// Static Listener, you can change this
static OnNetworkConnectionChangedListener mListener;
// Service to check if Wifi is connected or not
ConnectivityManager mConnectivityManager;
@Override
public void onReceive(Context context, Intent intent) {
if(mListener != null) {
if(mConnectivityManager == null) {
mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
mListener.onConnectionChanged(NetworkStatusHelper.getConnectivityStatus(mConnectivityManager) != NetworkStatusHelper.TYPE_NOT_CONNECTED);
}
}
public static boolean isConnected(Context context) {
return NetworkStatusHelper.getConnectivityStatus((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)) != NetworkStatusHelper.TYPE_NOT_CONNECTED;
}
public static void setOnNetworkConnectionChangedListener(OnNetworkConnectionChangedListener listener) {
mListener = listener;
}
public interface OnNetworkConnectionChangedListener {
public void onConnectionChanged(boolean connected);
}
}
有了这个,我需要获得ACCESS\u NETWORK\u STATE
权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
使用此功能,您可以跟踪Wifi
何时更改其连接并连接。好的,应用程序现在可以工作了。但问题是,它会启动启用WiFi()
,但不会等到连接后再发送请求。我在我的启用WiFi()
中加入了线程.sleep()
,但我想这不会有什么帮助。我如何解决这个问题?我想你必须注册一个广播接收器
,以便在连接Wifi
时收听。我将包含一些代码来帮助您开始这项工作。请稍候。我正在使用ConnectivityManager
检查WiFi是否已连接。同时让我试试那条路线。这个BroadcastReceiver
会在我调用enableWifi()
后被炒鱿鱼,对吗?所以我在我的AlarmReceiver
类中检查了这一点?Wifi连接需要多少时间并不准确,我不知道在AlarmReceiver
中使用Thread.sleep
等待是否是个好主意。因此,您可以让AlarmReceiver
实现OnNetworkConnectionChangedListener
。使用networkchangerecever
上的setOnNetworkConnectionChangedListener
添加AlarmReceiver
以等待Wifi连接,并继续您的流程。
<receiver
android:name="yourpackage.NetworkChangeReceiver"
android:label="NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>