【问题标题】:Strange debugger behaviour in Android studio when debugging an Async task调试异步任务时 Android Studio 中的奇怪调试器行为
【发布时间】:2016-05-27 05:26:43
【问题描述】:

我一直在尝试使用 Android Studio 断点来调试我的代码,但它们给了我非常奇怪的行为。例如,我正在尝试调试以下 sn-p:

new AsyncTask<Void, Void, Exception>() {
    @Override
    protected Exception doInBackground(Void... params) {
        try {
            Assets assets = new Assets(MainActivity.this);
            File assetDir = assets.syncAssets();
            setupRecognizer(assetDir);
        } catch (IOException e) {
            return e;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Exception result) {
        if (result != null) {
            ((TextView) findViewById(R.id.textView))
                    .setText("Failed to init recognizer " + result);
        } else {
            switchSearch(KWS_SEARCH);
        }
    }
}.execute();

我在行上放了一个断点

Assets assets = new Assets(MainActivity.this);

然后我说“步入”。这将我带到一个“反编译的类文件”和以下代码 sn-p:

public Assets(Context context) throws IOException {
    File appDir = context.getExternalFilesDir((String)null);
    if(null == appDir) {
        throw new IOException("cannot get external files dir, external storage state is " + Environment.getExternalStorageState());
    } else {
        this.externalDir = new File(appDir, "sync");
        this.assetManager = context.getAssets();
    }
}

这是完全可以预料和合理的。在此之后,我尝试进入该行

File appDir = context.getExternalFilesDir((String)null);

然后事情变得非常奇怪。首先,我被带到一个新文件中,在该文件中,我在两个方法之间找到了一个空白行。当我尝试进入空白行时,我被弹回到另一个文件,该文件的执行在另一个方法的右花括号处停止。然后我踏入那个花括号,我被带到另一个文件中两个方法之间的另一个空白行。当我踏入其中时,我被带到了下一行,这只是一个@override 注释。步入其中将我带到另一个文件中 if 语句的右花括号。

这种奇怪的行为持续不断,我无法理解。在某一时刻,调试器甚至似乎在评论中间暂停执行!这怎么可能呢?有谁知道为什么会这样?这与我正在调试 AsyncTask 的事实有关吗?

(请注意,我已经重复了这个调试过程四次,每次都出现相同的奇怪行为)

【问题讨论】:

  • 当您尝试进入代码的资产实例化行时,进入资产构造函数是正常的,并且是预期的。
  • @FuatCoşkun,我已经意识到这一点。那不是我的问题。我已经对问题进行了一些编辑以澄清

标签: java android debugging android-studio breakpoints


【解决方案1】:

在 Debug 中不是问题。当 Debug 在空白处或注释中暂停时,只是原始源代码类与提供的源不同步或不在同一版本。

编辑:

让我用一个例子来解释你。你有一个第三方库 xxx-1.1.jar,你想调试这个库的内部代码,所以你用谷歌搜索并找到这个 jar 的源代码 xxx-1.1-source.jar。但是由于某种原因,xxx-1.1-source.jar 的开发人员在创建 xxx-1.1.jar 2 小时后打包了这个源,他在你想要调试的某个类的开头添加了一些注释,所以,此时你调试 xxx -1.1.jar 使用 xxx-1.1-source.jar 提供的代码,源代码不完全匹配。

希望对你有帮助!

【讨论】:

  • 您能否更详细地说明您所说的源不同步时的意思?
  • (如果你能详细说明一下,我很乐意接受这个答案)
  • 好的,但是我有(以及如何)同步的库?我怎么能明白哪个是我的 asyncTask 版本?我怎么能理解我需要的版本?提前感谢
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2019-10-31
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多