【问题标题】:AsyncTask not updating UI after doInBackground finishesdoInBackground 完成后 AsyncTask 不更新 UI
【发布时间】:2016-01-06 00:57:56
【问题描述】:

我正在尝试制作一个简单的应用程序来查找 WiFi 网络并连接到它们。我目前在更新 UI 时遇到问题。

一些指针会很棒。感谢您的宝贵时间。

class UiUpdater extends AsyncTask<Void, Void, List<ScanResult>> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        TextView searching = (TextView) findViewById(R.id.searching);
        searching.setText("Currently searching...");
    }

    @Override
    protected List<ScanResult> doInBackground(Void... params) {
        WifiManager manager = (WifiManager) Client.this.getSystemService(Context.WIFI_SERVICE);

        if (!manager.isWifiEnabled())
            manager.setWifiEnabled(true);

        return manager.getScanResults();
    }

    @Override
    protected void onPostExecute(List<ScanResult> items) {
        super.onPostExecute(items);

        ArrayList<Items> wifi = new ArrayList<>();

        for (ScanResult s : items)
            wifi.add(new Items(s.SSID, s.capabilities));

        ///TextView searching = (TextView) findViewById(R.id.searching);
        ///searching.setText("");

        ListView list = (ListView) findViewById(R.id.list);
        Explorer adapter = new Explorer(Client.this, R.layout.listview_item_row, wifi);

        list.setAdapter(adapter);

        clickListener(list, wifi);
    }

}

【问题讨论】:

  • 您到底遇到了什么问题?您是否收到错误消息?有错误日志吗?
  • 我没有收到任何错误,它只是不会更新 UI,无论我等待多长时间。
  • 您是否验证过您的 doInBackground 是否返回了任何 ScanResults?
  • 是否调用了 onPostExecute?如果没有,那么似乎 getScanResults 永远不会返回。如果是,那么问题可能出在您的适配器上。
  • 是的,我试过'if(wifi!=null)',显然它返回了一些东西。

标签: java android android-asynctask


【解决方案1】:

请使用 Toast 消息或 logcat 或断点检查 onPost 执行是否被调用

【讨论】:

  • 我刚刚检查了 onPostExecute 被调用,它不能是我的适配器,因为如果我输入一些虚拟文本,它会轻松显示。
  • 你的视图应该更新我怀疑你的 wifi 大小的数组列表为零意味着你的 getScanResult 没有返回任何东西,为什么你看不到你的视图正在更新
【解决方案2】:

我设法让它工作,但采用了不同的方法。

我使用BroadcastReceiverregisterReceiver 来获取onReceive 事件来更新列表。

代码如下:

    mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);

    if(!mWifiManager.isWifiEnabled())
        mWifiManager.setWifiEnabled(true);
    mWifiManager.startScan();

    wifiReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context c, Intent intent)
        {
            if(mWifiManager != null) {
                List<ScanResult> networks = mWifiManager.getScanResults();
                showWifi(networks);
            }
        }
    };

    registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

虽然我还没有理解AsyncTask 的工作原理,但我确实通过加载一个简单的进度条得到了一些不错的结果。

我认为我遇到的问题是这样的:

  1. 我在另一个线程上发起了AsyncTask
  2. doInBackgroundgetScanResults 启动了另一个后台线程,导致doInBackground 认为工作已经完成。
  3. onPostExecute 被调用是因为 doInBackground 完成了它的工作。

归根结底,这不是AsyncTask 的错,是我不知道getScanResults 启动了另一个后台线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多