Android,Drawables保留在内存中,直到明确无效

时间:2015-09-19 08:17:53

标签: android android-layout android-memory

当在一个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);
}

1 个答案:

答案 0 :(得分:0)

与活动相关的UI相关事项应始终使用活动上下文。

这里也是

Context context = getApplicationContext();

是错误的做法。你应该使用

Context context = this;

这里