Câu hỏi Các trường hợp sử dụng thích hợp cho Android UserManager.isUserAGoat ()?


Tôi đã xem xét các API mới được giới thiệu trong Android 4.2. Trong khi nhìn vào UserManager lớp tôi đã đi qua các phương pháp sau đây:

 public boolean isUserAGoat()

Được sử dụng để xác định xem người dùng thực hiện cuộc gọi này có bị dịch chuyển hay không.

Trả về việc người dùng thực hiện cuộc gọi này có phải là một con dê hay không.

Làm thế nào và khi nào điều này nên được sử dụng?


3144
2017-11-14 08:34


gốc


xem thêm LIKE_TRANSACTION & TWEET_TRANSACTION trên IBinder developer.android.com/reference/android/os/…  developer.android.com/reference/android/os/… - auselen
Ngẫu nhiên, Chrome cũng có thống kê nội bộ "Goats Teleported". Có lẽ, đó là một số loại tên nội bộ cho một kỹ thuật quản lý bộ nhớ. - Eric Martindale
Nguồn thay đổi: https://android.googlesource.com/platform/frameworks/base/+/e4ab16ad98b183afbf7a21ad7314372de41a8b57%5E! - kennytm
@ djechlin có lẽ nó là hợp pháp, nhưng OP nên chấp nhận câu trả lời của user1597833 trích dẫn nguồn và các đám nên di chuyển cùng. nó là vô lý mà một câu hỏi như thế này đạt được rất nhiều lực kéo. có vẻ như không có lý do gì khi hỏi câu hỏi này và cho phép nó tiếp tục mở. - swasheck
Đó là một lỗi. Trả về false tất cả thời gian :( healthyhomesteading.com/wp-content/uploads/2011/05/goat.jpg - Thomas


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


Từ họ nguồn, phương thức được sử dụng để trả lại false cho đến khi nó được thay đổi trong API 21.

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 * @return whether the user making this call is a goat 
 */
public boolean isUserAGoat() {
    return false;
}

Có vẻ như phương pháp này không thực sự sử dụng cho chúng tôi với tư cách là nhà phát triển. Ai đó trước đó đã tuyên bố rằng nó có thể là một trứng Phục Sinh.

Trong API 21, việc triển khai đã được thay đổi để kiểm tra xem có ứng dụng đã cài đặt với gói không com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Đây là liên kết nguồn


1514
2017-11-14 08:40



chúng ta có khỉ, developer.android.com/reference/android/app/… - auselen
Lý thuyết: Dê được tìm thấy ở tất cả các loại nơi bấp bênh, giống như những vách đá dốc đứng, có thể làm chậm xu hướng vị trí mà chúng nhận được từ những người dùng không thường xuyên. Có thể giải thích "dịch chuyển tức thời", có thể là dê xuất hiện để di chuyển dữ dội khi phần mềm cố gắng xác định vị trí của chúng với các thuật toán được thiết kế cho những người không phải dê. - tedders
#define false random() % 2 nhưng đây không phải là Java ... - ppalasek
Đây là một bài học lịch sử, không phải là một câu trả lời. Ngay cả khi nó là một quả trứng Phục sinh, có một trường hợp sử dụng hợp lệ cho nó? Là một quả trứng Phục sinh không ngăn cản nó trở nên hữu ích, và bạn đã không cho biết nó là hay không hữu ích. - casperOne
Tôi cảm thấy xấu cho bất cứ ai sử dụng chức năng này một cách táo bạo, mong đợi nó trở lại false mãi mãi. - Martin Konecny


Tôi không biết đây có phải là "trường hợp sử dụng chính thức" hay không, nhưng sau đây tạo ra một cảnh báo trong Java (có thể tiếp tục tạo ra các lỗi biên dịch nếu được trộn lẫn với return báo cáo, dẫn đến mã không thể truy cập được):

while (1 == 2) { // Note that "if" is treated differently
    System.out.println("Unreachable code");
}

Tuy nhiên điều này là hợp pháp:

while (isUserAGoat()) {
    System.out.println("Unreachable but determined at runtime, not at compile time");
}

Vì vậy, tôi thường thấy mình viết một phương thức tiện ích ngớ ngẩn cho cách nhanh nhất để giả mạo một khối mã, sau đó hoàn thành gỡ lỗi tìm tất cả các cuộc gọi đến nó, vì vậy miễn là việc thực hiện không thay đổi điều này có thể được sử dụng cho điều đó.

JLS chỉ ra if (false) không kích hoạt "mã không thể truy cập" vì lý do cụ thể mà điều này sẽ phá vỡ hỗ trợ cho cờ gỡ lỗi, tức là, về cơ bản trường hợp sử dụng này (h / t @auselen). (static final boolean DEBUG = false; ví dụ).

tôi đã thay thế while cho if, tạo ra một trường hợp sử dụng tối nghĩa hơn. tôi tin bạn có thể đi lên IDE của bạn, giống như Eclipse, với hành vi này, nhưng bản chỉnh sửa này là 4 năm trong tương lai và tôi không có môi trường Eclipse để chơi.


917
2017-11-14 14:47



bạn đã thử nếu (false) {statement;}? - penguat
nếu (Boolean.FALSE) {...} thường có vẻ hoạt động. - Guerrero
@ djechlin Tôi không biết nếu đây là chỉ android, trong java tiêu chuẩn `if (false) {...}` biên dịch tốt (mở jdk javac 1.6 và 1.7) - josefx
@PeterOlson - nếu bạn đang cố gắng thử nghiệm một chi nhánh mã, nếu một sai sót hoặc đúng, đây là cách chính xác và rõ ràng nhất để mô phỏng điều đó - nhận xét về khối có thể kém chính xác hơn nếu bạn không khớp với kết thúc của khối (có lẽ bạn đã không nhận thấy một kín đáo nếu / khối khác ngay lập tức sau), nó sẽ dẫn đến một lỗi biên dịch nếu bạn đang buộc phải sau đây else khối, v.v. - djechlin
"miễn là việc triển khai không thay đổi" - và có vấn đề. Đây là một cách thảm hại để thực hiện một cảnh báo miễn phí "nếu (sai)" bởi vì việc thực hiện có thể và không thay đổi. Xem câu trả lời của tôi cho câu hỏi này: như của API21 isUserAGoat() trả về true nếu người dùng đã cài đặt một ứng dụng cụ thể. Chúc may mắn chẩn đoán rằng khi mã của bạn đột nhiên bắt đầu hoạt động kỳ quặc trên các thiết bị "ngẫu nhiên"! - Mark Whitaker


Điều này dường như là một trò đùa bên trong tại Google. Nó cũng xuất hiện trong trình quản lý tác vụ của Google Chrome. Nó không có mục đích, khác với một số kỹ sư tìm thấy nó thú vị. Đó là một mục đích của chính nó, nếu bạn sẽ.

  1. Trong Chrome, mở Trình quản lý tác vụ bằng Shift+Esc.
  2. Nhấp chuột phải để thêm Goats Teleported cột.
  3. Ngạc nhiên.

Thậm chí còn có một báo cáo lỗi Chromium rất lớn về quá nhiều dịch chuyển dê.

chrome 

Chromium sau đoạn mã nguồn bị đánh cắp từ HN bình luận.

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}

706
2017-11-14 09:03



tôi không có nó, bạn click chuột phải ở đâu? hoặc những gì nó được sử dụng cho - auselen
@auselen Bạn phải nhấp chuột phải vào tiêu đề cột để xem trình đơn thả xuống để thêm cột Được dịch chuyển từ người gọi (ít nhất đó là cách nó hoạt động trong Chrome trên OS X). cl.ly/Ksbd - greenie
Windows XP + Chrome mới nhất = nó không có ở đó, trên Ubuntu tôi thấy nó. - auselen
Windows 7 chạy Chrome doe mới nhất không hiển thị nó. : / - Isuru
Có khả năng là trò đùa bên trong có nguồn gốc ở đây: googleblog.blogspot.be/2010/04/goats-are-baaaahk.html - CupOfTea696


Bổ sung @djechlin câu trả lời (câu trả lời tốt bằng cách này!), cuộc gọi hàm này có thể là cũng thế được sử dụng làm mã giả để giữ một điểm ngắt trong một IDE khi bạn muốn dừng lại trong một số lần lặp cụ thể hoặc một cuộc gọi đệ quy cụ thể, ví dụ:

enter image description here

isUserAGoat() có thể được sử dụng thay cho một khai báo biến giả sẽ được hiển thị trong IDE như một cảnh báo và, trong trường hợp đặc biệt của Eclipse, sẽ làm tắc nghẽn dấu breakpoint, làm cho nó khó bật / tắt nó. Nếu phương thức được sử dụng như một quy ước, tất cả các lời gọi có thể sau đó được lọc bởi một số tập lệnh (trong giai đoạn cam kết có thể?).

enter image description here

Google guys là những người dùng Eclipse nặng (họ cung cấp một số dự án của họ như các plugin Eclipse: Android SDK, GAE, v.v.), do đó câu trả lời @djechlin và câu trả lời bổ sung này có ý nghĩa rất nhiều (ít nhất là đối với tôi).


258
2017-11-21 16:55



Nếu bạn đang viết "giả" mã chỉ để nhanh chóng kiểm tra một cái gì đó, vấn đề với một cảnh báo Eclipse là gì ?? Tôi nghĩ rằng điều này thực sự tuyệt vời như bạn có thể tìm thấy trong trường hợp bạn đã quên - Tomasz
@ Tomasz vấn đề là, trong Eclipse, nhãn cảnh báo sẽ cắt đứt điểm ngắt và bạn phải mở chế độ xem điểm ngắt để tắt hoặc loại bỏ nó - higuaro
Vâng, tôi có một giải pháp cho điều đó. Bạn có thể nhấp chuột phải vào biểu tượng cảnh báo và chọn "Toggle Breakpoint". Nếu dòng / tùy chọn sau được bật nó có nghĩa là điểm ngắt được tạo. Vấn đề của tôi là, mã giả là xấu và nó nên là một cảnh báo để bạn không quên;) - Tomasz
@Tomasz Vấn đề với giải pháp đó là bạn đã biết trước điểm ngắt, vì vậy việc kiểm tra trực quan đơn giản sẽ không cho bạn biết rằng cảnh báo ẩn một điểm ngắt, một giải pháp thậm chí tốt hơn, là sử dụng các điểm ngắt có điều kiện, với chúng bạn có thể quên đi mã giả (và các phương thức quy ước), nhưng chúng khác nhau giữa IDE và không thể được chia sẻ tự động giữa các máy trạm - higuaro
Tại sao không chỉ sử dụng một câu lệnh rỗng ;? Ý tôi là, dê rõ ràng hơn, nhưng có một cách dễ dàng - Chris M.


Có một phương thức có tên là funny / constant / bất cứ điều gì trong mỗi phiên bản của Android.

Cách sử dụng thực tế duy nhất mà tôi từng thấy là trong Cuộc gọi cuối cùng Google I / O Cuộc thi nơi họ hỏi nó là gì cho một phiên bản cụ thể, để xem các thí sinh có đọc báo cáo khác biệt của API cho mỗi bản phát hành hay không. Cuộc thi cũng có vấn đề về lập trình, nhưng nói chung một số câu đố có thể được xếp loại tự động đầu tiên để có được số lượng bài nộp xuống với số tiền hợp lý sẽ dễ kiểm tra hơn.


122
2017-11-14 17:26



"Có một phương pháp có tên là funny / constant / bất cứ điều gì trong mỗi phiên bản của Android." Bạn có thể đặt tên cho một số? - Angelo.Hannes
Ví dụ, có một bản ghi nhật ký được gọi là Log.wtf mà họ gọi là Thất bại khủng khiếp: P - Aracem
Hơi giống EProgrammerNotFound của Delphi? stackoverflow.com/questions/2084120/… - Gerry Coll
HoneyComb là AdapterViewAnimator # fyiWillBeAdvancedByHostKThx () - Lance Nanek
@ Angelo.Hannes, Trong các hằng số cảm biến cho trọng lực có một cho Death Star (Star Wars) - st0le


Trong kỷ luật nhận dạng giọng nói, người dùng được chia thành  và những con cừu.

Ví dụ: tại đây trên trang 89:

Cừu là những người mà nhận dạng giọng nói hoạt động đặc biệt tốt, và dê là những người mà nó hoạt động đặc biệt kém. Chỉ người nhận dạng giọng nói mới biết được những gì ngăn cách họ. Mọi người không thể dự đoán giọng nói của ai sẽ được nhận ra dễ dàng và ai sẽ không nhận ra. Chính sách tốt nhất là thiết kế giao diện để nó có thể xử lý tất cả các loại giọng nói trong mọi môi trường

Có lẽ, nó được lên kế hoạch để đánh dấu người dùng Android là dê trong tương lai để có thể cấu hình công cụ nhận dạng giọng nói cho nhu cầu của dê. ;-)


110
2018-05-31 09:33





Google có sở thích nghiêm túc về dê và dê trưng Phục Sinh. Thậm chí đã có các bài đăng Stack Overflow trước đây về nó.

Như đã được đề cập trong các bài đăng trước, nó cũng tồn tại trong trình quản lý tác vụ của Chrome (nó xuất hiện lần đầu trong tự nhiên vào năm 2009):

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

Và sau đó trong các phiên bản Chrome, Linux và Windows vào đầu năm 2010). Số lượng "Goats Teleported" trên thực tế ngẫu nhiên:

 int TaskManagerModel::GetGoatsTeleported(int index) const {
     int seed = goat_salt_ * (index + 1);
     return (seed >> 16) & 255;
 }

Các tham chiếu khác của Google cho dê bao gồm:

Mối tương quan sớm nhất của dê và Google thuộc về bài đăng blog "Cắt với dê" ban đầu, theo như tôi có thể nói.

Chúng ta có thể giả định một cách an toàn rằng nó chỉ là một quả trứng Phục sinh và không sử dụng trong thế giới thực, ngoại trừ việc trở về false.


104
2017-11-15 10:33



IBM cũng được đồn đại là có tài liệu tham khảo dê trong các phần mềm nội bộ khác nhau. - goat


Kể từ API 21 (SDK Android 5.0 / Lollipop đầu tiên), điều này phát hiện xem Giả dê ứng dụng được cài đặt:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Điều này sẽ làm cho nó rõ ràng rằng đề nghị của djechlin sử dụng nó như một cảnh báo miễn phí if (false) là một chiến lược có khả năng thảm khốc. Điều gì đã trả về trước đây false cho mỗi thiết bị hiện trả về một giá trị dường như ngẫu nhiên: nếu điều này được chôn sâu đủ trong mã của bạn, nó có thể mất một Dài thời gian để tìm ra nơi các lỗi mới của bạn đến từ đâu.

Điểm mấu chốt: nếu bạn không kiểm soát việc thực hiện một phương thức và quyết định sử dụng nó cho các mục đích khác ngoài được nêu trong tài liệu API, bạn sẽ gặp rắc rối.


101
2017-10-20 10:00



Tại sao bất cứ ai từng đưa bất kỳ loại if(false) trong sản xuất? Lại đây. Nếu đó là những gì mã của bạn trông giống như sau đó thực hiện thay đổi này là ít nhất các vấn đề của bạn. - djechlin
Vâng, theo tài liệu API thực tế (xu hướng dịch chuyển người dùng), tôi nghĩ việc sử dụng nó để luôn trả về false thực sự là chỉ có cách để làm theo hợp đồng. Tuy nhiên, bạn đưa ra một điểm tốt. - codebreaker
Mô phỏng dê trông tuyệt vời trên google play play.google.com/store/apps/…. Nó sẽ là tốt để biết những gì người ta có thể đạt được từ một con dê. - cowls