2011-07-31 27 views
8

Tôi đang sử dụng loại mẫu:Có cách nào để tự động đăng nhập tên phương thức trong Android không?

public class FooProvider extends ContentProvider { 
    private static final String TAG = FooProvider.class.getSimpleName(); 
    ... 

    @Override 
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { 
     l.v(TAG, TAG + ".update() Uri:" + uri.toString() + " " + db.getPath()); 

đâu l là wrapper của tôi tròn Androids Log.v mà mất Chuỗi ... args. Điều này sẽ cho sản lượng logcat như thế này:

FooProvider.update() Uri: foo bar etc 

Những gì tôi đang tìm kiếm là một cách để đăng nhập tên phương pháp, trong bản cập nhật trường hợp này(), tự động và trong một cách mà sống sót refactoring cách TAG làm. Tôi đã nhìn thấy các class.getMethods() gọi nhưng không thể nhìn thấy một cách để lập chỉ mục danh sách trả về với phương pháp hiện tại lúc chạy.

+0

bạn nên thử thư viện đơn giản này: https://github.com/MustafaFerhan/DebugLog – gturedi

Trả lời

13

Bạn có thể muốn quấn các báo cáo tại một hằng số, vì vậy họ có được biên dịch ra cho phiên bản xuất bản của bạn (mà sẽ không được in báo cáo Log.v anyway), nhưng bạn có thể làm điều gì đó như thế này:

private static final boolean FINAL_CONSTANT_IS_LOCAL = true; 
private static final String TAG = FooProvider.class.getSimpleName(); 

private String getLogTagWithMethod() { 
    if (FINAL_CONSTANT_IS_LOCAL) { 
     Throwable stack = new Throwable().fillInStackTrace(); 
     StackTraceElement[] trace = stack.getStackTrace(); 
     return trace[0].getClassName() + "." + trace[0].getMethodName() + ":" + trace[0].getLineNumber(); 
    } else { 
     return TAG; 
    } 
} 

Nó sẽ phụ thuộc vào cách bạn gọi nó để xác định chỉ số nào của StackTraceElement mà bạn sẽ muốn, chỉ cần gỡ lỗi hoặc chơi vài lần để tìm nó.

Khi bạn biên dịch phiên bản đã xuất bản của mình, chỉ cần đặt FINAL_CONSTANT_IS_LOCAL thành false và khối mã đó sẽ biến mất, luôn trả về TAG.

+0

Thật khéo léo. Ý thức cũng rất thông minh - tôi ước tôi có thể trao cả hai cho bạn. –

9

Có vẻ như đắt nhưng bạn có thể sử dụng

String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); 

Lý do bạn sử dụng một chỉ số của 2, là 0 = sẽ quay trở lại currentThread và 1 = getStackTrace. Điều này làm việc trên Java 1.5 trở lên, tôi sẽ bọc nó trong một số loại (DEBUG) {} để nó không có trong mã sản xuất

Tất nhiên bạn sẽ cần phải điều chỉnh độ sâu nếu bạn đặt nó vào trong một phương thức vv .

0

bạn có thể làm phương pháp tĩnh như thế này và gọi cho họ ngay từ đầu và kết thúc của những phương pháp bạn muốn debug:

public static void entry_log(String id) { 
       Throwable stack = new Throwable().fillInStackTrace(); 
       StackTraceElement[] trace = stack.getStackTrace(); 

        Log.v("ENTRY", 
          id + " - " + trace[1].getClassName() + "." 
            + trace[1].getMethodName() + ":" 
            + trace[1].getLineNumber()); 
        break; 

      } 

public void exit_log(String id) { 
      Throwable stack = new Throwable().fillInStackTrace(); 
      StackTraceElement[] trace = stack.getStackTrace(); 

       Log.v("EXIT", 
         id + " - " + trace[1].getClassName() + "." 
           + trace[1].getMethodName() + ":" 
           + trace[1].getLineNumber()); 
       break; 

     } 

Tôi tạo ra this Logging utility cho Android với một vài tính năng khác, ngoại trừ các bản ghi xuất nhập cảnh. Bạn có thể thấy nó hữu ích.

Các vấn đề liên quan