奇抜な開発問題のまとめ(メモリ解放)

1963 ワード

今日1つの奇抜な问题に出会って、1つの位置を决める必要があるActivityに入って、位置を决めた后に1回指定のインターフェースを呼び出して、それから私は発见して、退出して更に1回このActivityに入って、インターフェースの呼び出し回数は増加して、ああ、绝えずデバッグした后に、问题が奇抜ではありませんことを発见して、私が2を犯したのです......记念して、^^;
public class NearActivity extends Activity implements Observer{
    private LBS mLBS;
    private boolean isRequesting = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_near_list);
        mLBS = LBS.getInstance(this);
        mLBS.registerObserever(this);
        initUI();
        locateAndRequest();
    }
    
    private void locateAndRequest() {
        mLBS.locating(true);
    }

    private void initUI() {
        // 
    }

    @Override
    public void onFailed(String msg) {
        isRequesting = false;
    }

    @Override
    public void onSuccess(Response response) {
        isRequesting = false;
    }

    @Override
    public void update(Observable observable, Object result) {
        if(isRequesting) {
            //TODO  , 
            return;
        }
        isRequesting = true;
        sendRequest();
    }
}

主なロジックは上のようなもので、このActivityを脱退して、入ってきて、位置決め後の要求は何度も歩いて、つまりisRequestingという変数はずっとfalseで、これは私に理解できなくて、プロセスid、スレッドidを印刷したのはすべて正常です.どうしてだめなの!
それからisRequestingをvolatileに変更しましたが、まだ問題は解決できません.staticに変更します.はい、ここの値はtrueですが、結局、インタフェースにはデータが少しもありません.でもやっと原因が見つかりましたよね?その奇抜な原因は--彼の娘の私はメモリを解放していないので、このActivityは単例クラスLBSに引用されているので、位置決め結果が帰ってくるたびにすべての観察者(つまりこのactivityの複数の例)にインタフェースをリフレッシュするように通知されます.222222222
解決方法:
@Override
    protected void onDestroy() {
        super.onDestroy();
        if(null != mLBS) {
            mLBS.unRegisterObserever(this);
            mLBS = null;
        }
        //TODO  
    }

最も簡単なインタフェースの実現を軽視しないでください.私が実現したとき、頭がメモリを解放したことがあります.最後に、このような簡単なインタフェースが解放されなくてもメモリに何の影響も与えないことを考えて、無視しました.代価は明らかに高いので、覚えておいてください.