我正在将应用程序作为连接到网络上的设备(特定设备)的项目的一部分。点击一个调用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.VISIBLE
。 button.invalidate()
不起作用。
到目前为止,唯一有效的方法是重新创建活动,但这并不理想,因为用户输入丢失了,这只是不好的做法。
有什么建议吗?
======================
编辑:所以现在不是为每个设备运行单独的AsyncTask
,而是在一个任务中完成所有连接,结果由onPostExecute
而不是task.get()
处理。最终结果是相同的 - 按钮消失。
======================
更新:我在调试模式中逐步完成了代码,发现在创建DefaultHttpClient
对象(org.apache.http.impl.client)后按钮消失了。我要进入那个班级,看看我是否能弄明白它到底发生了什么。
答案 0 :(得分:0)
请检查您尝试在asynctask的doInBackground()方法中禁用按钮的天气,如果是这样,您需要在onPostExecute()方法中禁用禁用代码的按钮。因为无法从doInBackground()修改UI线程。