1.7 KiB
This error is reported in Java, and specifically on Android. These reports are triggered when a method that runs on the UI thread may block, thus potentially leading to an Application Not Responding error.
Infer considers a method as running on the UI thread whenever:
- The method, one of its overrides, its class, or an ancestral class, is
annotated with
@UiThread
. - The method, or one of its overrides is annotated with
@OnEvent
,@OnClick
, etc. - The method or its callees call a
Litho.ThreadUtils
method such asassertMainThread
.
The issue is reported when a method deemed to run on the UI thread
- Makes a method call which may block.
- Takes a lock, and another thread takes the same lock, and before releasing it, makes a call that may block.
Calls that may block are considered:
- Certain I/O calls.
- Two way
Binder.transact
calls. - Certain OS calls.
Future
orAsyncTask
calls toget
without timeouts, or with too large timeouts.
To suppress starvation reports in a method m()
use the
@SuppressLint("STARVATION")
annotation, as follows:
import android.annotation.SuppressLint;
@SuppressLint("STARVATION")
public void m() {
...
}
To signal to Infer that a method does not perform any blocking calls, despite
appearences, you can use the @NonBlocking
annotation:
import com.facebook.infer.annotation.NonBlocking;
@NonBlocking
public void m() {
...
}
This instructs Infer to filter out any potentially blocking calls in m()
(also, transitively), and thus any other method can expect no starvation reports
due to a call to m()
. You will need to set up your class path appropriately to
include the JAR files in infer/annotations
for this annotation to work.