以下は、カスタム 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" の値は MAIN スレッドで実行されているため、-100 になると予想していましたが、ログに出力される値は実際には 100 です。
ある意味で、私は誰もが通常の Java プログラムで行う古典的な間違いを再現しようとしていますが、Android はそれを賢く回避しているようです。
だから私は、アンドロイドが2つのスレッド間の事前発生関係をどのように達成しているかを理解することに興味があります.