java - Android 按钮在运行 AsyncTask 后消失

标签 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
}

// ...

以上代码位于 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.VISIBLEbutton.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/

相关文章:

java - 谷歌地方信息 API : place category and place information

android - alarmmanager 立即启动

java - 如何在 AsyncTask 之后更改 ActionBar 颜色?

java - 在 Eclipse 中单步调试第三方代码

java - Android @NonNull 和 Jetbrains @NonNull 有什么区别

java - 处理对象数组

java - 我无法在离线时正确访问缓存的图像

java - 如何管理 Spring Batch block 内较短的事务?

android - 删除android中的动态表行

android - 如何使用 AsyncTask 和 Timer 获取 XML?