当在一个Activity中我以编程方式创建一个布局(根本没有layout.xml)并从drawables池中为它分配一个drawable,然后销毁所述Activity,除非我这样做,否则内存不会得到GC
layout.getBackground.setCallback(null);
layout.setBackground(null);
我在哪里可以找到解释为什么会发生这种情况以及为什么layout.xml和以编程方式创建的布局之间存在差异?在第一种情况下,由于某种原因,我不必调用setBackground(null)。
更新:以下代码
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getApplicationContext();
//Setting up UI
layout = new LinearLayout(context);
layout.setBackgroundDrawable(Stuff.getRandomDrawable(ManageCities.this));
cityUpdater = new Button(context);
cityRemover = new Button(context);
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle(R.string.pls_wait);
progressDialog.setCancelable(false);
cityUpdater.setText(R.string.update_city_list);
cityRemover.setText(R.string.remove_city);
cityRemover.setOnClickListener(this);
cityUpdater.setOnClickListener(this);
database = WalkerDatabase.getInstance(
getSharedPreferences(FirstActivity.getPrefsName(), 0).
getString("datapath", null));
adapter = database.getItems();
layout.setOrientation(LinearLayout.VERTICAL);
ur = new WifiUpdateReciever(cityUpdater);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(ur, intentFilter);
if (adapter.isEmpty()) {
cityRemover.setEnabled(false);
}
layout.addView(cityUpdater);
layout.addView(cityRemover);
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!Stuff.isRunningOnEmulator()) {
if (!mWifi.isConnected()) {
Toast.makeText(this, getString(R.string.wifi_disabled), Toast.LENGTH_LONG).show();
cityUpdater.setEnabled(false);
cityUpdater.setClickable(false);
}
}
setContentView(layout);
}
答案 0 :(得分:0)
与活动相关的UI相关事项应始终使用活动上下文。
这里也是
Context context = getApplicationContext();
是错误的做法。你应该使用
Context context = this;
这里