【问题标题】:aSyncTask running only onceaSyncTask 只运行一次
【发布时间】: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() 循环,它成功了!非常感谢您的帮助。

标签: android android-asynctask


【解决方案1】:

解决方案非常简单,感谢 Jyoti JK 和 0xDEADC0DE 的帮助。

只需要使用Thread.sleep(milli)而不是for()循环。

现在我的 aSyncTask 运行良好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2011-12-13
    • 2017-10-17
    • 2013-11-13
    • 2017-01-24
    相关资源
    最近更新 更多