Java Android按钮在运行AsyncTask后消失

Java Android按钮在运行AsyncTask后消失,java,android,android-asynctask,android-button,Java,Android,Android Asynctask,Android Button,我正在制作一个应用程序,作为一个项目的一部分,该项目将连接到网络上的一个特定设备。单击调用AsyncTask的按钮后,该按钮将消失且不可单击 我正在使用此库中的类: 有关守则: // ... int numAdded = addResultsToDatabase(items); if(!deviceInitTask.isCancelled() && numAdded > 0) { String devices = "device"; if(numAdded

我正在制作一个应用程序,作为一个项目的一部分,该项目将连接到网络上的一个特定设备。单击调用AsyncTask的按钮后,该按钮将消失且不可单击

我正在使用此库中的类:

有关守则:

// ...

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只是尝试连接到设备,使用提供的用户名和密码登录,如果成功,则返回身份验证令牌和到期。如果无法连接,则从任务内调用this.canceltrue并显示Toast

注意,我正在测试它,以便登录失败,因此numAdded==0

我不知道是什么引起的。运行上述代码后,该按钮仍具有View.VISIBLE。无效按钮不起作用

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

有什么建议吗

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

编辑:因此,现在不再为每个设备运行单独的AsyncTask,而是在一个任务中完成所有连接,结果由onPostExecute而不是task.get处理。最终结果是一样的——按钮消失了

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


更新:我在调试模式下逐步查看了代码,发现在创建DefaultHttpClient对象org.apache.http.impl.client后,按钮消失了。我将进入该类,看看是否能找出它发生的确切位置。

请检查您是否试图在asynctask的doInBackground方法中禁用按钮,如果是,您需要在onPostExecute方法中使用按钮禁用代码。因为UI线程不能从doInBackground修改。

我认为您没有正确使用AsyncTask。您需要使用AsyncTask在onPostExecute回调中获取登录详细信息。请尝试实现您自己的自定义AsyncTask,而不是从get调用结果。在doInBackground中执行您的后台任务,并根据结果更改onPostExecute中按钮的可见性。@hoomi,事实上,您已经成功了……我会试试看它是否有效。@Kieran您解决了吗?@nahwarang,是的,刚刚完成重构并测试了它,同样的情况也发生了。尽管根本没有对其进行任何操作,但刚刚翻转的按钮消失了!见编辑谢谢你的回答,大卫,但是我并没有试图禁用这个按钮,这就是为什么这让人困惑的原因。AsyncTask中唯一的UI工作是显示Toast,它在UI线程上运行。