2016-02-16 3 views
2

Я пытаюсь использовать точки останова Android Studio, чтобы отлаживать мой код, но они дают мне чрезвычайно странное поведение. Например, я пытаюсь отлаживать следующий фрагмент кода:Странное поведение отладчика в студии Android при отладке задачи Async

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); 

И тогда я говорю «Шаг в». Это берет меня к «декомпилируемой файл класса» и в следующем фрагменте кода:

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?

(Обратите внимание, что я повторил этот процесс отладки четыре раза, и были представлены с тем же странным поведением каждый раз)

+0

Это нормально и ожидается, что вы перейдете в конструктор объектов при попытке войти в строку создания объектов вашего кода. –

+0

@ FuatCoşkun, я уже знаю об этом. Это не мой вопрос. Я немного изменил вопрос, чтобы уточнить – TheIronKnuckle

ответ

4

не является проблемой в Debug. Когда пауза отладки в пустом пространстве или в комментарии есть только то, что исходный класс исходного кода и предоставленный источник не синхронизированы или не находятся в одной и той же версии.

EDIT:

Позвольте мне объяснить вам пример. У вас есть сторонняя библиотека xxx-1.1.jar, и вы хотите отлаживать внутренний код этой библиотеки, чтобы вы googled и находили исходный xxx-1.1-source.jar этой банки. Но по какой-то причине разработчик xxx-1.1-source.jar упаковал этот источник через 2 часа после создания xxx-1.1.jar, и он добавляет некоторый комментарий в начале некоторого класса, который вы хотите отлаживать, в этот момент, когда вы отлаживаете xxx -1.1.jar, используя код, предоставленный xxx-1.1-source.jar, исходный код не соответствует точно.

Надеюсь, это поможет!

+0

Не могли бы вы немного подробнее рассказать о том, что вы имеете в виду, когда говорите, что источник не синхронизирован? – TheIronKnuckle

+0

(Я рад принять этот ответ, если вы немного уточните) – TheIronKnuckle

+0

ОК, но с какой библиотекой у меня есть (и как) для синхронизации? как я могу понять, какая моя версия asyncTask? и как я могу понять, какая версия мне нужна? заранее спасибо – ocrampico