"This Handler Class Should Be Static Or Leaks Might Occur"的解法是什么?
What is the solution of "This Handler Class Should Be Static Or Leaks Might Occur"?
我正在做一个蓝牙通信项目,我需要在 devices.Upon 之间传输数据接收 InputStream 我将数据传递给 UI 线程从工作线程使用以下代码:-
// Read from the InputStream.
numBytes = mmInStream.read(mmBuffer);
// Send the obtained bytes to the UI activity.
Message readMsg = handler.obtainMessage(MessageConstants.MESSAGE_READ,numBytes, -1,mmBuffer);
readMsg.sendToTarget();
下面是我的处理程序class:-
public Handler mHandler = new Handler() {
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg=new String(readBuf,0,msg.arg1);
TextView textView=findViewById(R.id.textview);
textView.setText(readMsg);
}
}
但是这会显示以下警告:
This Handler class should be static or leaks might occur(anonymous android.os.Handler).
我尝试将 class 设为静态,但随后出现以下错误:-
Non-static method findViewById(int) can't be referenced from a static context.
我应该怎么做才能解决这个问题?
public MyHandler mHandler;
public static class MyHandler extends Handler {
WeakReference<TextView> mTextViewReference;
public MyHandler(TextView textView) {
mTextViewReference = new WeakReference<TextView>(textView);
}
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg = new String(readBuf,0,msg.arg1);
TextView textView = mTextViewReference.get();
if(textView != null) {
textView.setText(readMsg);
};
}
public void clear() {
mTextViewReference.clear();
mTextViewReference = null;
}
}
protected void onCreate(final Bundle savedInstanceState) {
....
mHandler = new MyHandler(findViewById(R.id.textView));
....
}
@Override
public void onDestroy() {
if(mHandler != null) {
mHandler.clear();
mHandler = null;
}
super.onDestroy();
}
编辑
如果您只想更新一首单曲 TextView
,则上述修复工作正常。然而,很多时候,您需要采取更多行动并更新更多内容(不仅仅是单个 TextView
)。因此,我认为您可以创建一个 Interface
,每次收到消息时都会调用它。类似于:
public class MyActivity extends Activity {
public MyHandler mHandler;
protected final void onCreate(final Bundle savedInstanceState) {
//....
mHandler = new MyHandler(new MyHandler.OnMessageReceivedListener() {
@Override
public void handleMessage(final String message) {
// Update the views as you with
}
});
//....
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.clear();
}
public static class MyHandler extends Handler {
WeakReference<OnMessageReceivedListener> mListenerReference;
public MyHandler(OnMessageReceivedListener listener) {
mListenerReference = new WeakReference<>(listener);
}
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg = new String(readBuf,0,msg.arg1);
OnMessageReceivedListener listener = mListenerReference.get();
if(listener != null) {
listener.handleMessage(readMsg);
};
}
public void clear() {
mListenerReference.clear();
}
public interface OnMessageReceivedListener {
void handleMessage(String message);
}
}
}
你的 handleMessage
部分没有做很重的工作人员,所以不需要扩展 Handler
保持简单和轻量级;只需添加一个回调即可。在 Activity/Fragment:
中创建回调
private class MessageCallback implements Handler.Callback {
@Override
public boolean handleMessage(@NonNull Message message) {
// Here you can call any UI component you want
TextView textView=findViewById(R.id.textview);
textView.setText(readMsg);
return true;
}
}
然后将其命名为:
Handler handler = new Handler(getMainLooper(), new MessageCallback());
Message readMsg = handler.obtainMessage(what, arg1, arg2, object);
readMsg.sendToTarget();
我正在做一个蓝牙通信项目,我需要在 devices.Upon 之间传输数据接收 InputStream 我将数据传递给 UI 线程从工作线程使用以下代码:-
// Read from the InputStream.
numBytes = mmInStream.read(mmBuffer);
// Send the obtained bytes to the UI activity.
Message readMsg = handler.obtainMessage(MessageConstants.MESSAGE_READ,numBytes, -1,mmBuffer);
readMsg.sendToTarget();
下面是我的处理程序class:-
public Handler mHandler = new Handler() {
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg=new String(readBuf,0,msg.arg1);
TextView textView=findViewById(R.id.textview);
textView.setText(readMsg);
}
}
但是这会显示以下警告:
This Handler class should be static or leaks might occur(anonymous android.os.Handler).
我尝试将 class 设为静态,但随后出现以下错误:-
Non-static method findViewById(int) can't be referenced from a static context.
我应该怎么做才能解决这个问题?
public MyHandler mHandler;
public static class MyHandler extends Handler {
WeakReference<TextView> mTextViewReference;
public MyHandler(TextView textView) {
mTextViewReference = new WeakReference<TextView>(textView);
}
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg = new String(readBuf,0,msg.arg1);
TextView textView = mTextViewReference.get();
if(textView != null) {
textView.setText(readMsg);
};
}
public void clear() {
mTextViewReference.clear();
mTextViewReference = null;
}
}
protected void onCreate(final Bundle savedInstanceState) {
....
mHandler = new MyHandler(findViewById(R.id.textView));
....
}
@Override
public void onDestroy() {
if(mHandler != null) {
mHandler.clear();
mHandler = null;
}
super.onDestroy();
}
编辑
如果您只想更新一首单曲 TextView
,则上述修复工作正常。然而,很多时候,您需要采取更多行动并更新更多内容(不仅仅是单个 TextView
)。因此,我认为您可以创建一个 Interface
,每次收到消息时都会调用它。类似于:
public class MyActivity extends Activity {
public MyHandler mHandler;
protected final void onCreate(final Bundle savedInstanceState) {
//....
mHandler = new MyHandler(new MyHandler.OnMessageReceivedListener() {
@Override
public void handleMessage(final String message) {
// Update the views as you with
}
});
//....
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.clear();
}
public static class MyHandler extends Handler {
WeakReference<OnMessageReceivedListener> mListenerReference;
public MyHandler(OnMessageReceivedListener listener) {
mListenerReference = new WeakReference<>(listener);
}
public synchronized void handleMessage(Message msg) {
byte[] readBuf=(byte[])msg.obj;
String readMsg = new String(readBuf,0,msg.arg1);
OnMessageReceivedListener listener = mListenerReference.get();
if(listener != null) {
listener.handleMessage(readMsg);
};
}
public void clear() {
mListenerReference.clear();
}
public interface OnMessageReceivedListener {
void handleMessage(String message);
}
}
}
你的 handleMessage
部分没有做很重的工作人员,所以不需要扩展 Handler
保持简单和轻量级;只需添加一个回调即可。在 Activity/Fragment:
private class MessageCallback implements Handler.Callback {
@Override
public boolean handleMessage(@NonNull Message message) {
// Here you can call any UI component you want
TextView textView=findViewById(R.id.textview);
textView.setText(readMsg);
return true;
}
}
然后将其命名为:
Handler handler = new Handler(getMainLooper(), new MessageCallback());
Message readMsg = handler.obtainMessage(what, arg1, arg2, object);
readMsg.sendToTarget();