我正在制作一个应用程序作为连接到网络上的设备(特定设备)的项目的一部分。单击调用 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
}
// ...
以上代码位于 ButtonRectangle
对象上的匿名 OnClickListener
内。 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
只是尝试连接到设备,使用提供的用户名和密码登录,并在成功时返回身份验证 token 和到期时间。如果无法连接,则会从任务内调用 this.cancel(true)
并显示 Toast。
请注意,我正在对此进行测试,以便登录失败,因此numAdded == 0
。
我不知道是什么原因造成的。上述代码运行后,按钮仍然具有 View.VISIBLE
。 button.invalidate()
不起作用。
显然,到目前为止唯一有效的方法是重新创建 Activity ,但这并不理想,因为用户输入会丢失,而且这不是一个好的做法。
有什么建议吗?
======================
编辑:所以现在不再为每个设备运行单独的 AsyncTask
,所有连接都在一个任务中完成,并且结果由 onPostExecute
而不是 task.get()
处理。最终结果是相同的 - 按钮消失。
======================
更新:我在 Debug模式下单步执行了代码,发现该按钮在创建 DefaultHttpClient
对象 (org.apache.http.impl.client) 后消失。我将走进那个类(class),看看我是否能弄清楚它到底发生在哪里。
最佳答案
请检查您是否尝试在异步任务的 doInBackground() 方法中禁用按钮,如果是这样,您需要在 onPostExecute() 方法中删除按钮禁用代码。因为UI线程不能从doInBackground()修改。
关于java - Android 按钮在运行 AsyncTask 后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29078999/