当前位置: 首页 > 面试题库 >

如何在我的活动中添加runOnUiThread()

越伟泽
2023-03-14
问题内容

我添加了AsyncTask来将网络操作卸载到后台线程。我需要确保UI操作位于UI线程上,因此我想在Activity中使用runOnUiThread()。

谢谢你的帮助

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);
    new scan().execute();
}
public class scan extends AsyncTask<String, Integer, String> {

public Object WIFI_SERVICE;
@Override
protected void onProgressUpdate(Integer...integers)  {
     ArrayList<ClientScanResult> clients = wifiApManager.getClientList(false);
        tv.setText("WifiApState: " + wifiApManager.getWifiApState() + "\n\n");
        tv.append("Clients: \n");
        for (ClientScanResult clientScanResult : 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");
            }
}
@Override
        protected void onPostExecute(String result){
            tv.setText(result);             
        }
@Override
protected String doInBackground(String... params) {
    wifiApManager = new WifiApManager(this);
    // the above line shows a Error
    return null;
}
}
}

编辑

我想在TextView中显示已处理的文本

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");
                       }
}
}

问题答案:

我添加了AsyncTask来将网络操作卸载到后台线程。我需要确保UI操作位于UI线程上,因此我想在Activity中使用runOnUiThread()。

啊! 没有!!!除以外, 每种 方法都AsyncTask可以运行。您也可以通过从进行调用来进行网络操作并更新in 或in 。UI Thread``doInBackground()``doInBackground()``UI``onPostExecute()``onProgressUpdate()``publishProgress()``doInBackground()

请勿runOnUiThread()与一起使用AsyncTask。至少对于我来说,没有理由使用它,AsyncTask因为它具有已经在上运行的方法UI Thread。我从未见过它会做任何事情,但会带来麻烦。

您可以致电publishProgress()loop,并更新您TextViewonProgressUpdate()或添加值的ArrayList中和更新onProgressUpdate()

请多次阅读文档。AsyncTask刚开始时有点棘手,但是一旦您了解了它的功能,那么它可能就是一件美丽的事情。

编辑

创建您的实例AsyncTask并将其传递Activity Context给它

Scan myScan = new scan(this); // pass the context to the constructor
myScan.execute();

然后在中创建一个构造函数,AsyncTask并接受Context

public class scan extends AsyncTask<String, Integer, String> 
{

     public Object WIFI_SERVICE;
     public Context context;   // Context variable

     public scan(Context c)  // constructor to take Context
     {
         context = c;   // intialize your Context variable
     }

现在使用该变量

    @Override
    protected String doInBackground(String... params) 
    {
        wifiApManager = new WifiApManager(context);  // use the variable here
        return null;
    }

另一个编辑

class scan extends AsyncTask<String, Void, Void> {
     ArrayList<ClientScanResult> clients;
     Context context;

...

then initialize your `clients` in `doInBackground()`

clients = wifiApManager.getClientList(false);

改变onPostExecute()为不接受任何东西

protected void onPostExecute(Void result){

然后将更新其中的代码TextView放入其中。



 类似资料:
  • 问题内容: 我正在尝试在MVC中向我的引导导航栏添加“活动”类,但是在编写时,以下内容未显示活动类: 这可以解决看起来像格式正确的类,但是不起作用: 在Bootstrap文档中,它指出不应在导航栏中使用“a”标签,但是我认为以上是将类添加到Html.ActionLink的正确方法。我还有另一种(整洁)的方式可以做到这一点吗? 问题答案: 在Bootstrap中,需要将类应用于元素,而不是。 基于活

  • 活动、直播、会议本质都是市场活动,活动营销可以理解为非线下会议、在线直播的其他线上线下活动类型均可在活动营销下进行活动推广获客。 访问【设置】-【市场活动设置】可将活动类型映射到活动营销场景进行前端推广获客:

  • 我想在活动中加载插页广告并在另一个活动中显示它。我找到了这个主题,并尝试执行第一个答案中的步骤,但有很多错误。 如何使用intent预加载admob中间广告并发送到另一个android活动 我所做的: >

  • 我需要的TabLayout有一个“x”的标签数量,这可以根据用户的数据,已经在数据库中有所不同 My xml: 我的代码:

  • 我的目标是:在像乒乓球这样的东西中,关键控件应该平稳地移动蝙蝠。 期望:希望蝙蝠用钥匙平稳地向上或向下移动。实际结果:蝙蝠像落后或速度变化一样移动。 我试过用速度变量和lerp,但它们滞后。我试过增加和减少y值,但效果更差。我搜索了一下,但找不到解决方案。 我叫矩形蝙蝠和圆形乒乓球。而且,这是我第一天在这里发帖。 游戏截图 以下是panal代码:

  • 我有一个基于WordPress的网站,我的主题通过添加“当前菜单项”类来突出当前菜单项。 问题是,我有一个包含3个子菜单项的菜单项,它们都指向具有不同容器ID的相同页面(它们的href包含容器ID),因此它们都被突出显示。 如何仅突出显示href指向当前查看的容器的菜单项? 我尝试了这个答案,在标签后面插入了以下内容: