Joã*_*nda 5 android button android-asynctask
我正在尝试在执行下载任务时禁用按钮.我尝试过使用setEnabled,setVisibility和setClickable.我想我尝试了这些选项的所有组合.所有这些都在任务执行时禁用了按钮单击事件,但事件仍在某种程度上被注册,当我响应按钮时,如果我在禁用时单击按钮,则会调用处理程序...即使它是看不见或"走了"!(不确定它是否被称为处理程序,我想引用onClick方法).
我还插入了一个计数器和一个Log来验证我上面说过的内容.代码如下所示.这段代码if(counter>1) return;旨在阻止崩溃,但我想删除它,因为我想重新启用按钮,而不是永远禁用它.
的onClick:
public void downloadOnClick(View v) {
counter++;
Log.d(this.getLocalClassName(), "Button was clicked " + counter + " times.");
if(counter>1) return;
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
//mButton.setVisibility(View.GONE);
mButton.setEnabled(false);
//mButton.setClickable(false);
mTextView.setText("Getting html file...");
// if we use simple http, we will need to handle redirect status code
new DownloadWebpageTask().execute("https://www.google.com/");
} else {
mTextView.setText("No network connection available.");
}
}
Run Code Online (Sandbox Code Playgroud)
的AsyncTask:
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
private HttpURLConnection mConnection;
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
mConnection = (HttpURLConnection) url.openConnection();
mConnection.setReadTimeout(10000 /* milliseconds */);
mConnection.setConnectTimeout(15000 /* milliseconds */);
mConnection.setRequestMethod("GET");
mConnection.setDoInput(true);
mConnection.connect();
int statusCode = mConnection.getResponseCode();
if (statusCode != HttpURLConnection.HTTP_OK) {
return "Error: Failed getting update notes";
}
return readTextFromServer(mConnection);
} catch (IOException e) {
return "Error: " + e.getMessage();
}
}
private String readTextFromServer(HttpURLConnection connection) throws IOException {
InputStreamReader stream = null;
try {
stream = new InputStreamReader(connection.getInputStream());
BufferedReader br = new BufferedReader(stream);
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line + "\n");
line = br.readLine();
}
return sb.toString();
} finally {
if (stream != null) {
stream.close();
}
}
}
@Override
protected void onPostExecute(String result) {
mTextView.setText(result);
// Can not reactivate button / cancel (pending?) events....
//mButton.setVisibility(View.VISIBLE);
mButton.setEnabled(true);
//mButton.setClickable(true);
}
}
Run Code Online (Sandbox Code Playgroud)
完整的项目(它非常简单,只是一个训练示例)可以在我刚刚创建的这个存储库中进行测试.
总而言之,根据我的阅读,实际上存在关于按钮禁用的问题.大多数情况下,只有在标志为true时才通过使用标志来解析onClick方法.虽然,这并没有解决重新启用按钮的问题.我也试过mButton.cancelPendingInputEvents();但它不起作用(我不知道为什么.点击事件尚未注册?或者它们没有待处理?
这个问题有一个简单的解决方案吗?有任何想法吗?我错过了一些基本细节吗?如果没有,我正在考虑尝试以编程方式创建一个新按钮以解决问题.如果我不保留对旧按钮的引用,是否通过垃圾回收删除它们?
提前致谢!
[编辑]澄清:
由于标题在这一点上可能会产生误导,我想澄清我能够禁用并重新启用该按钮,除非禁用禁止,否则所有功能都可以.请注意,我已添加该行if(counter>1) return;仅用于测试,但它停止按钮按我想要的方式工作(这就是为什么我没有使用标志.我不希望这条线在我解决问题时就在那里!).该日志足以告诉我重新启用该按钮时正在调用该方法,因为我在禁用该按钮时单击它!
我发现,在您的示例中,AsyncTask完成速度如此之快,以至于在很短的时间内Button由于被禁用而无法单击。所以,这基本上是一个时间问题。
Button我发现通过延迟 4 秒的重新启用,它可以按预期工作。
请注意,通过此更改,从视觉上看,在填充Button后立即重新启用。TextView
以下是代码更改onPostExecute():
@Override
protected void onPostExecute(String result) {
mTextView.setText(result);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//re-enable the button
mButton.setEnabled(true);
}
}, 4000);
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以删除计数器逻辑,它现在应该按预期工作:
public void downloadOnClick(View v) {
Log.d(this.getLocalClassName(), "Button was clicked");
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
mButton.setEnabled(false);
mTextView.setText("Getting html file...");
// if we use simple http, we will need to handle redirect status code
new DownloadWebpageTask().execute("https://www.google.com/");
} else {
mTextView.setText("No network connection available.");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5125 次 |
| 最近记录: |