【发布时间】:2018-05-17 08:16:06
【问题描述】:
我正在开发一个 Android 蓝牙应用程序,当我想扫描我周围的可用设备时,我使用了 aSyncTask。这个aSyncTask 很简单,在"onPreExecute()" 中,我使用"myBluteoothAdaptaer.startDiscovery()" 来发现设备,在"onPostExecute()" 中使用"myBluteoothAdaptaer.cancelDiscovery()" 来阻止它。
但是当我运行我的应用程序时,doInBackground() 函数在第一次点击时只执行一次。如果我再次单击按钮,Button 的代码可以工作,但 aSyncTask 没有正确执行(当它工作时,progressBar 需要 2s 才能完成。当它不工作时,它只需要在 0.1 ms 附近完成它)。
所以也许这个错误来自doInBackground(),停在onPreExecute()或类似的东西?
提前感谢您的帮助。
代码如下:
按钮点击代码:(只需设置一个)
/** Scan on click **/
Scan_btn.setOnClickListener(new View.OnClickListener() { // click on SCAN button
@Override
public void onClick(View view) {
if (!blueAdapter.isDiscovering()) {
//blueAdapter.startDiscovery();
Scan_btn_clic = true;
} else {
//blueAdapter.cancelDiscovery();
Scan_btn_clic = false;
}
Maj scan = new Maj();
scan.execute();
}
});
/***********/
doInBackground() 函数:
@Override
protected Void doInBackground(Void... arg0) {
int progress;
for (progress=0;progress<=100;progress++)
{
if (blueAdapter.isEnabled() && Scan_btn_clic == false || !blueAdapter.isEnabled())
{
for (int i=0; i<5000000; i++){}
//la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate
publishProgress(progress);
progress++;
}
else if (blueAdapter.isEnabled() && Scan_btn_clic == true)
{
for (int i = 0; i < 100000000; i++) {}
//la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate
publishProgress(progress);
progress++;
}
}
return null;
}
【问题讨论】:
-
你为什么不试试
Thread.sleep(sec);inside task -
您注意到
Scan_btn_clic == false中的for 循环比另一个短20 倍吗?这可能解释了时间上的差异,因为时间也短了 20 倍。不过更重要的是;如果您想等待一段时间,请使用Thread.sleep(milliseconds)而不是 for 循环。不同之处在于 for 循环不太准确,它实际上使用 CPU 周期 -
我有 2 个
for()根据单击的按钮等待 2 个不同的时间。我尝试使用Thread.sleep(milliseconds)而不是for()循环,它成功了!非常感谢您的帮助。