奇抜な開発問題のまとめ(メモリ解放)
1963 ワード
今日1つの奇抜な问题に出会って、1つの位置を决める必要があるActivityに入って、位置を决めた后に1回指定のインターフェースを呼び出して、それから私は発见して、退出して更に1回このActivityに入って、インターフェースの呼び出し回数は増加して、ああ、绝えずデバッグした后に、问题が奇抜ではありませんことを発见して、私が2を犯したのです......记念して、^^;
主なロジックは上のようなもので、このActivityを脱退して、入ってきて、位置決め後の要求は何度も歩いて、つまりisRequestingという変数はずっとfalseで、これは私に理解できなくて、プロセスid、スレッドidを印刷したのはすべて正常です.どうしてだめなの!
それからisRequestingをvolatileに変更しましたが、まだ問題は解決できません.staticに変更します.はい、ここの値はtrueですが、結局、インタフェースにはデータが少しもありません.でもやっと原因が見つかりましたよね?その奇抜な原因は--彼の娘の私はメモリを解放していないので、このActivityは単例クラスLBSに引用されているので、位置決め結果が帰ってくるたびにすべての観察者(つまりこのactivityの複数の例)にインタフェースをリフレッシュするように通知されます.222222222
解決方法:
最も簡単なインタフェースの実現を軽視しないでください.私が実現したとき、頭がメモリを解放したことがあります.最後に、このような簡単なインタフェースが解放されなくてもメモリに何の影響も与えないことを考えて、無視しました.代価は明らかに高いので、覚えておいてください.
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
}
最も簡単なインタフェースの実現を軽視しないでください.私が実現したとき、頭がメモリを解放したことがあります.最後に、このような簡単なインタフェースが解放されなくてもメモリに何の影響も与えないことを考えて、無視しました.代価は明らかに高いので、覚えておいてください.