下面是一個自定義的App類和MainActivity類別代碼示例代碼示例:怎麼了之前發生關係建立在這兩個線程的Android
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,並嘗試從主線程讀取值。
我期待的價值「i」的的onResume和的handleMessage是-100,因爲它們是在主線程中執行,但日誌打印值實際上100
是在某種程度上,我試圖重現每個人在常規的java程序中都會犯的經典錯誤,但是android似乎明智地避免了它。
所以我有興趣瞭解android如何實現兩個線程之間的發生關係。
實際上,由於Android的處理程序,實際上有一個發生之前的關係。閱讀下面的答案。 – Petrakeas 2015-09-29 14:32:42