【问题标题】:Android button disappears after running AsyncTask运行 AsyncTask 后 Android 按钮消失
【发布时间】:2015-05-18 16:41:43
【问题描述】:

我正在制作一个应用作为项目的一部分,该项目连接到网络上的设备(特定设备)。单击调用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 只是尝试连接到设备,使用提供的用户名和密码登录,如果成功则返回身份验证令牌和过期。如果无法连接,则从任务中调用 this.cancel(true) 并显示 Toast。

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

我不知道是什么原因造成的。上面的代码运行后,按钮仍然有View.VISIBLEbutton.invalidate() 不起作用。

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

有什么建议吗?

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

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

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

更新:我在调试模式下单步执行了代码,发现在创建 DefaultHttpClient 对象 (org.apache.http.impl.client) 后按钮消失了。我要走进那个班级,看看我能不能弄清楚它到底发生在哪里。

【问题讨论】:

  • 我认为您没有正确使用 AsyncTask。您需要使用 AsyncTask 在 onPostExecute 回调中获取您的登录详细信息
  • 尝试实现您自己的自定义 AsyncTask,而不是从 get() 调用结果。在 doInBackground 中执行您的后台任务,并根据结果更改 onPostExecute 中按钮的可见性。
  • @hoomi,你真的很准确......我会试试看它是否有效。
  • @Kieran 你解决了吗?
  • @nahwarang,是的,现在刚刚完成重构并对其进行了测试,并且发生了完全相同的事情。尽管根本没有调用任何操作,但刚刚翻转的按钮消失了! (见编辑)

标签: java android android-asynctask android-button


【解决方案1】:

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

【讨论】:

  • 感谢大卫的回答,但我根本不想禁用该按钮,这就是为什么这令人困惑。在 AsyncTask 中完成的唯一 UI 工作是显示 Toast,它在 UI 线程上运行。
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2015-09-04
  • 2011-06-09
  • 2018-08-15
  • 1970-01-01
相关资源
最近更新 更多