下面是自定义 App 类和 MainActivity 类代码的示例代码示例:
public class App extends Application {
private static String TAG = "APP";
private int i;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, Thread.currentThread().getName());
HandlerThread t = new HandlerThread("init-thread");
t.start();
i = -100;
Handler handler = new Handler(t.getLooper());
handler.post(new Runnable() {
@Override
public void run() {
i = 100;
}
});
handler.post(new Runnable() {
@Override
public void run() {
MainActivity.MainHandler h = new MainActivity.MainHandler(Looper.getMainLooper(), App.this);
h.sendEmptyMessage(0);
}
});
}
public int getI() {
return i;
}
}
和 MainActivity 类:
public class MainActivity extends Activity {
private static String TAG = "ACT-1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
App app = (App) getApplication();
Log.e(TAG, "i: " + app.getI()); //prints 100
}
public static class MainHandler extends Handler {
private Application application;
public MainHandler(Looper looper, Application app) {
super(looper);
this.application = app;
}
@Override
public void handleMessage(Message msg) {
App app = (App) application;
Log.e(TAG, "MSG.what: " + msg.what);
Log.e(TAG, "i: " + app.getI()); //prints 100
}
}
}
我正在尝试做的是在 INIT-THREAD 中将“i”的值更改为 100,并从 MAIN 线程尝试读回该值。
我期望 onResume 和 handleMessage 中“i”的值为 -100,因为它们在 MAIN 线程中执行,但 Log 打印的值实际上是 100。
在某种程度上,我试图重现每个人在常规 java 程序中都会犯的经典错误,但 android 似乎聪明地避免了它。
所以我有兴趣了解android如何实现两个线程之间的happens-before关系。