如何解决Asynctask问题?

时间:2013-12-30 18:35:04

标签: java android android-asynctask wifimanager

我的应用在Log Cat中显示NetworkOnMainThreadException。 所以我找到了Asynctask方法来将网络操作卸载到后台线程。 添加AsyncTask后,它会显示ViewRootImpl$CalledFromWrongThreadException。所以我必须使用onPostExecute 我学会了Asyntack文档&试过。现在我得知它没有返回正确的输出。我不知道我是否在相应的方法下宣布它。

我想在Textview tv

中显示已处理的文字

所以帮助我正确的方向:)

感谢您的帮助......

WifiApManager

public class WifiApManager {
     private final WifiManager mWifiManager;

public WifiApManager(Context context) {
    mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}

public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
    try {
        if (enabled) { // disable WiFi in any case
            mWifiManager.setWifiEnabled(false);
        }

        Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
        return (Boolean) method.invoke(mWifiManager, wifiConfig, enabled);
    } catch (Exception e) {
        Log.e(this.getClass().toString(), "wifi", e);
        return false;
    }
}

public WIFI_AP_STATE getWifiApState() {
    try {
        Method method = mWifiManager.getClass().getMethod("getWifiApState");

        int tmp = ((Integer)method.invoke(mWifiManager));

        // Fix for Android 4
        if (tmp > 10) {
            tmp = tmp - 10;
        }

        return WIFI_AP_STATE.class.getEnumConstants()[tmp];
    } catch (Exception e) {
        Log.e(this.getClass().toString(), "wifi", e);
        return WIFI_AP_STATE.WIFI_AP_STATE_FAILED;
    }
}


public boolean isWifiApEnabled() {
    return getWifiApState() == WIFI_AP_STATE.WIFI_AP_STATE_ENABLED;
}


public WifiConfiguration getWifiApConfiguration() {
    try {
        Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");
        return (WifiConfiguration) method.invoke(mWifiManager);
    } catch (Exception e) {
        Log.e(this.getClass().toString(), "wifi", e);
        return null;
    }
}


public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) {
    try {
        Method method = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
        return (Boolean) method.invoke(mWifiManager, wifiConfig);
    } catch (Exception e) {
        Log.e(this.getClass().toString(), "wifi", e);
        return false;
    }
}


public ArrayList<ClientScanResult> getClientList(boolean onlyReachables) {
    return getClientList(onlyReachables, 10);
}


public ArrayList<ClientScanResult> getClientList(boolean onlyReachables, int reachableTimeout) {
    BufferedReader br = null;
    ArrayList<ClientScanResult> result = null;

    try {
        result = new ArrayList<ClientScanResult>();
        br = new BufferedReader(new FileReader("/proc/net/arp"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] splitted = line.split(" +");

            if ((splitted != null) && (splitted.length >= 4)) {
                // Basic sanity check
                String mac = splitted[3];

                if (mac.matches("..:..:..:..:..:..")) {
                    boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);

                    if (!onlyReachables || isReachable) {
                        result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable));
                    }
                }
            }
        }
    } catch (Exception e) {
        Log.e(LOGTAG, e.toString());
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            Log.e(LOGTAG, e.toString());
        }
    }
return result;
}
}

connect.java

public class connect extends Activity{
WifiApManager wifiApManager;
TextView tv;
Button scan;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.connect);
    tv =(TextView) findViewById(R.id.iptv);
scan myScan = new scan(this); // pass the context to the constructor
    myScan.execute();
}
class scan extends AsyncTask<String, Void, Void> { 
    public Context context;
    ArrayList<ClientScanResult> clients;
    public scan(Context c)  // constructor to take Context
    {
        context = c;   // Initialize your Context variable
    }

    protected Void doInBackground(String... params) {
            wifiApManager = new WifiApManager(context);  // use the variable here
             clients = wifiApManager.getClientList(false);
            return null;
    }
    }           
    protected void onPostExecute(Void result){
        ArrayList<ClientScanResult> clients;
        tv.setText("WifiApState: " + wifiApManager.getWifiApState() + "\n\n");
        tv.append("Clients: \n");
for (ClientScanResult clientScanResult : clients) //showin error in clients
     {
                tv.append("####################\n");
                tv.append("IpAddr: " + clientScanResult.getIpAddr() + "\n");
                tv.append("Device: " + clientScanResult.getDevice() + "\n");
                tv.append("HWAddr: " + clientScanResult.getHWAddr() + "\n");
                tv.append("isReachable: " + clientScanResult.isReachable()+ "\n");
                           }
    }
    }

注意: 它在客户端变量中的onPostExecute方法中显示connect.java中的错误。

1 个答案:

答案 0 :(得分:3)

你的onPostExecute(...)

ArrayList<ClientScanResult> **clients**;

然后

for (ClientScanResult clientScanResult : **clients**) //showin error in clients

clients为null因此永远不会执行循环。您不需要定义新的ArrayList,因为您已经在扫描类

中定义了一个全局变量

更好的方法是将doInBackground的返回类型设置为ArrayList&lt; ClientScanResult&GT;然后你有onPostExecute取一个ArrayList&lt; ClientScanResult&GT;

class scan extends AsyncTask<Void, Void, ArrayList<ClientScanResult>> { 

protected ArrayList<ClientScanResult> doInBackground(Void... params) {
    wifiApManager = new WifiApManager(context);  // use the variable here
    return wifiApManager.getClientList(false);
}

protected void onPostExecute(ArrayList<ClientScanResult> clients){

tv.setText("WifiApState: " + wifiApManager.getWifiApState() + "\n\n");
tv.append("Clients: \n");
for (ClientScanResult clientScanResult : clients) //showin error in clients
    {
        tv.append("####################\n");
        tv.append("IpAddr: " + clientScanResult.getIpAddr() + "\n");
        tv.append("Device: " + clientScanResult.getDevice() + "\n");
        tv.append("HWAddr: " + clientScanResult.getHWAddr() + "\n");
        tv.append("isReachable: " + clientScanResult.isReachable()+ "\n");
    }
}