doInBackground完成后AsyncTask不更新UI

时间:2016-01-06 00:57:57

标签: java android android-asynctask

我正在尝试创建一个寻找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);
    }

}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我使用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. doInBackground中,getScanResults启动了另一个后台主题,引导doInBackground认为工作已完成。
  3. onPostExecute因为doInBackground完成了工作而被调用。
  4. 最重要的是,它不是AsyncTask的错误,我不知道getScanResults启动了另一个后台线程。