鑑於此代碼非靜態方法:安卓:調用從靜態的Handler類
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
public static final int MESSAGE_NOT_CONNECTED = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
// -------------------------------------------------
public final void setStatus(int Rid) {
final ActionBar actionBar = getActionBar();
actionBar.setSubtitle(Rid);
}
// -------------------------------------------------
static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_NOT_CONNECTED:
setStatus(R.string.title_not_connected);
break;
}
}
}
}
我收到編譯錯誤:無法使靜態參考非靜態方法setStatus(INT)..
這是有道理的,因爲setStatus()中的getActionBar()是一個非靜態方法。
由於警告,我使Handler類成爲靜態的:這個Handler類應該是靜態的或者可能發生泄漏。
問題:如何從靜態處理程序中正確訪問setStatus()方法?
編輯:新的處理程序代碼是答案。
static class hHandler extends Handler {
private final WeakReference<MainActivity> mTarget;
hHandler(MainActivity target) {
mTarget = new WeakReference<MainActivity>(target);
}
@Override
public void handleMessage(Message msg) {
MainActivity target = mTarget.get();
If(target == null) {
return;
}
switch (msg.what) {
case MESSAGE_NOT_CONNECTED:
target.setStatus(R.string.title_not_connected);
break;
}
}
}
http://stackoverflow.com/q/11407943/844882 – 2012-08-06 12:32:05
@Alex Lockwood提供的鏈接導致另一個鏈接Romain Guy幫助我理解WeakReferences:靜態與非靜態內部類[鏈接](https://groups.google.com/forum/?fromgroups#!msg/android-developers/1aPZXZG6kWk/lIYDavGYn5UJ)。 我可以回答我自己的問題,但我無法發佈它。 – vedavis 2012-08-06 14:18:18
我回答了問題(因爲您顯然無法發佈它...):P – 2012-08-06 16:38:47