Câu hỏi Làm cách nào để tôi có thể gỡ lỗi mã doInBackground của AsyncTask


Tôi có breakpoints thiết lập, nhưng họ dường như được bỏ qua (hoặc không bao giờ nhìn thấy).

Mã của tôi là dưới đây. Tôi đang cố gắng để sao lưu một db sql vào một thẻ SD.

Khi tôi chạy nó (không phải chế độ Debug) trong nhật thực, tôi nhận được thông báo từ onPreExecute và theo sau là thông báo từ onPostExecute.

Tôi có BreakPoints được đặt trong hầu hết mọi dòng của ExportDatabaseFileTask.

Khi tôi chạy nó (trong chế độ Debug) trong nhật thực, tôi dừng lại tại các điểm ngắt trong onPreExecute, và sau đó khi tôi bước xa hơn, VERY NEXT LINE mà Debugger đi đến là:

mDbHelper.open ();

Sau đó tôi bước qua phần còn lại của mã bình thường và trái với wD AVD hiển thị thông báo từ onPreExecute, nơi nó dường như sẽ KHÔNG BAO GIỜ.

Tôi KHÔNG thấy bất kỳ dòng nào BREAKPOINTED trong:

doInBackground onPostExecute copyFile

Vì vậy, tôi phải tôn trọng không đồng ý với nhận xét rằng tôi không có nó bị phá vỡ hoặc nó không được thực hiện. Vì vậy, tôi sẽ reask câu hỏi của tôi: Làm thế nào để bạn gỡ lỗi (STEP THROUGH) doInBackground mã của một AsyncTask?

        case BACKUP_ID:
            if (ScoreAGame.this.isExternalStorageAvail()) {
                mDbHelper.close();
                new ExportDatabaseFileTask().execute();
                mDbHelper.open();
            } else {
                Toast.makeText(ScoreAGame.this, "External storage is not available, unable to export data.",
                           Toast.LENGTH_SHORT).show();
            }
            return true;
        case RESTORE_ID:
            selectCourse();
            return true;
    }

    return super.onMenuItemSelected(featureId, item);
}

private boolean isExternalStorageAvail() {
    return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}

private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> {
    private final ProgressDialog dialog = new ProgressDialog(ScoreAGame.this);

    // can use UI thread here
    protected void onPreExecute() {
        this.dialog.setMessage("Exporting database...");
        this.dialog.show();
    }

    // automatically done on worker thread (separate from UI thread)
    protected Boolean doInBackground(final String... args) {

        File dbFile =
            new File(Environment.getDataDirectory() + "/data/com.discgolf/databases/discgolfdb.db");

        File exportDir = new File(Environment.getExternalStorageDirectory(), "discgolfbackup");
        if (!exportDir.exists()) {
            exportDir.mkdirs();
        }
        File file = new File(exportDir, dbFile.getName());

        try {
            file.createNewFile();
            this.copyFile(dbFile, file);
            return true;
        }
        catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
            return false;
        }
    }

    // can use UI thread here
    protected void onPostExecute(final Boolean success) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
        if (success) {
            Toast.makeText(ScoreAGame.this, "Export successful!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(ScoreAGame.this, "Export failed", Toast.LENGTH_SHORT).show();
        }
    }

    void copyFile(File src, File dst) throws IOException {
        FileChannel inChannel = new FileInputStream(src).getChannel();
        FileChannel outChannel = new FileOutputStream(dst).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(), outChannel);
        }
        finally {
            if (inChannel != null) {
                inChannel.close();
            }
            if (outChannel != null) {
                outChannel.close();
            }
        }
    }

}


16
2017-08-13 14:50


gốc


Hãy thử đặt một Log.d () trong nhiệm vụ - Stefan Bossbaly
@Tom Wruble - bạn đã thêm chưa Log.d() in ra doInBackground? chúng có được in không? - MByD
Tôi đang đọc giữa các dòng, nhưng nó xuất hiện mà bạn (trong khi không actuially nói nó) không thể bước qua tất cả các mã trong một AsyncTask, và rằng cách onbly để gỡ lỗi nó là thông qua các báo cáo Đăng nhập. Nếu đó là sự thật, tuyệt, tôi có thể giải quyết nó. Nhưng lúc đầu, bạn nói rằng tôi đã không thiết lập Breakpoints hoặc rằng codxe đã không được thực hiện, chắc chắn IMPLIES rằng bạn CÓ THỂ bước qua mã trong AysyncTask thông qua Debug. - Tom Wruble
Thú vị ... Tôi đã thực hiện gỡ lỗi AsyncTask.doInBackground trước đó bằng cách thiết lập các điểm ngắt trong nó và sau đó bước qua. Trình gỡ rối Eclipse có nhiều khả năng gỡ lỗi các ứng dụng đa luồng. Nhiều khả năng, mã nguồn không được đồng bộ hóa ở đâu đó với mã được biên dịch. Tôi đề nghị làm "sạch" trong Eclipse và sau đó xây dựng lại dự án trước khi chạy nó trong chế độ gỡ lỗi. Đồng thời kiểm tra xem các điểm ngắt không bị vô hiệu hóa (trong chế độ xem Gỡ lỗi). - Aleks G
Tôi chỉ phát hiện ra rằng nếu tôi đặt một số Log.d() trong doInBackground() rằng trình gỡ lỗi đột nhiên bắt đầu đánh các điểm ngắt !! - Someone Somewhere


Các câu trả lời:


kiểm tra điều này Làm cách nào để sử dụng trình gỡ rối Eclipse trong AsyncTask khi phát triển cho Android?

Đặt đoạn mã sau vào đầu doInBackground()

if(android.os.Debug.isDebuggerConnected())
    android.os.Debug.waitForDebugger();

Sau đó, khi bạn thiết lập một breakpoint trong thread đó, eclipse sẽ tìm thấy nó.

Lịch sự: sargas


39
2017-09-01 19:59





Trong doInBackground () của bạn, hãy thêm thông tin sau..`

    protected Integer doInBackground(String... params) {
    // for debug worker thread
    if(android.os.Debug.isDebuggerConnected())
        android.os.Debug.waitForDebugger();

    // create the file with the given file path
    File file = new File(params[0]);

    // enter rest of the code here..
}

`


4
2018-01-15 06:34





Nếu họ bị bỏ qua, thì có lẽ đây là một trong hai điều sau:

  1. Bạn chạy dự án không ở chế độ gỡ lỗi.
  2. Bạn không bao giờ thực sự đạt được những dòng trong quá trình thực hiện.

3
2017-08-13 14:52



Không thể tin rằng tôi đã quên .execute(). +1 - pandalion98


Nếu một tác vụ Async khác đang chạy trong nền, thì có thể là một công cụ mới bỏ qua để chạy phương thức doinbackground, vì vậy hãy thử chạy như sau:

(new ExampleAsyncTask()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

1
2017-09-15 09:20





Tôi đã phải đối mặt với một cái gì đó tương tự trong Android Studio. Đối với tôi, đó là do Proguard đang hoạt động trong quá trình gỡ lỗi. Proguard đã làm rối tung các số dòng sau khi rút gọn. Bạn có thể tắt Proguard bằng cách xóa minfyEnabled true từ build.gradle của bạn


0
2018-05-11 05:29