У меня есть обработчик, который объявлен в главном потоке:Утечка памяти обработчика?
mainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Bundle bundle = msg.getData();
mTextView.setText(bundle.getString("message"));
break;
. . .
default:
super.handleMessage(msg);
break;
}
}
};
Где mTextView представляет собой определенный TextView OnCreate().
У меня есть задача, которая используется в отдельной теме. В Runnable магазины mainHandler
от основного потока и говорит ему отправлять сообщения:
public class SomeRunnable implements Runnable {
private Handler mHandler;
public SomeRunnable(Handler handler) throws IOException {
. . .
mHandler = handler;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
. . .
Message msg = mHandler.obtainMessage();
. . .
mHandler.sendMessage(msg);
}
} catch (IOException e) {
Log.e("Error", e.hashCode() + ": " + e.getLocalizedMessage());
}
}
}
Я видел, что вы потенциально можете создать утечку памяти с помощью таких методов, как Handler#postDelayed()
если класс Handler не является статичным. Но я использую Handler#sendMessage()
, который мгновенно помещает сообщение в очередь сообщений.
Я все еще в опасности иметь утечку памяти? Даже с:
@Override
protected void onDestroy() {
super.onDestroy();
mThread.interrupt();
mainHandler.removeCallbacksAndMessages(null);
}
Спасибо!
Это не видно из кода, который вы в курсе, но делает ваш 'Handler' или' Runnable' проводить какие-либо ссылки на непреходящий объекты? Кроме того, вопреки тому, что вы, кажется, говорите, я ожидаю, что «статичный» обработчик будет более подвержен утечкам памяти, чем то, что я вижу выше. – 323go
@ 323go мой Runnable «SomeRunnable» имеет тот же адрес, что и мой обработчик «mainHandler» из основного потока. Это то, что вы определяете как не-переходное? Мой обработчик не содержит ссылок, хотя он относится к TextView в основном потоке. – Zack
Тогда вы можете сделать ссылку на 'mainHandler'' WeakReference', чтобы быть в безопасности. В противном случае похоже, что с тобой все будет в порядке. – 323go