运行AsyncTask后,Android按钮消失

时间:2015-03-16 14:14:10

标签: java android android-asynctask android-button

我正在将应用程序作为连接到网络上的设备(特定设备)的项目的一部分。点击一个调用AsyncTask的按钮后,该按钮消失,无法点击。

我正在使用此库中的ButtonRectangle类:https://github.com/navasmdc/MaterialDesignLibrary

相关代码:

// ...

int numAdded = addResultsToDatabase(items);
if(!deviceInitTask.isCancelled() && numAdded > 0) {
    String devices = "device";
    if(numAdded > 1) {
        devices = "devices";
    }
    Toast.makeText(NewLocalDeviceScanResultsActivity.this,
            "Added " + NumberToWords.convert(numAdded) + " " + devices,
            Toast.LENGTH_LONG).show();

    // go to device list activity
    Intent intent = new Intent(NewLocalDeviceScanResultsActivity.this, DeviceListActivity.class);
    startActivity(intent);
    finish();
}
else {
    // button disappears
}

// ...

上面的代码位于OnClickListener对象上的匿名ButtonRectangle内。 addResultsToDatabase方法如下:

// ...

List<String[]> devices = new ArrayList<>();
for(int i = 0; i < items.size(); i++) {
    ScanResultsRecyclerViewAdapter.ListItem item = items.get(i);
    if(item.isSelected()) {
        String[] device = new String[4];
        device[0] = item.getDescription().trim();
        device[1] = item.getHost().trim();
        device[2] = item.getLoginUsername().trim();
        device[3] = item.getLoginPassword().trim();

        devices.add(device);
    }
}

// try connecting and get results
deviceInitTask = new LocalDeviceInitTask(this, devices);
deviceInitTask.execute();

// ...

DeviceInitTask只是尝试连接到设备,使用提供的用户名和密码登录并返回身份验证令牌,如果成功则到期。如果无法连接,则会在任务中调用this.cancel(true)并显示Toast。

请注意,我正在对此进行测试,以便登录失败,因此numAdded == 0

我对导致它的原因感到茫然。上述代码运行后,该按钮仍为View.VISIBLEbutton.invalidate()不起作用。

到目前为止,唯一有效的方法是重新创建活动,但这并不理想,因为用户输入丢失了,这只是不好的做法。

有什么建议吗?

======================

编辑:所以现在不是为每个设备运行单独的AsyncTask,而是在一个任务中完成所有连接,结果由onPostExecute而不是task.get()处理。最终结果是相同的 - 按钮消失。

======================

更新:我在调试模式中逐步完成了代码,发现在创建DefaultHttpClient对象(org.apache.http.impl.client)后按钮消失了。我要进入那个班级,看看我是否能弄明白它到底发生了什么。

1 个答案:

答案 0 :(得分:0)

请检查您尝试在asynctask的doInBackground()方法中禁用按钮的天气,如果是这样,您需要在onPostExecute()方法中禁用禁用代码的按钮。因为无法从doInBackground()修改UI线程。