Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Android中的单独AsyncTask类连接WiFi管理器_Java_Android_Android Asynctask - Fatal编程技术网

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>