不能使用静态处理程序类,因为"不能从静态上下文中引用"

时间:2016-09-15 08:38:22

标签: java android static

我正在为android编写一个简单的套接字客户端应用程序,这是我的处理程序类:

static Handler IncomingHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (flag) {
            kq += msg.obj.toString() + "\r\n";
            textResponse.setText(kq);
        }
    }
};

此处理程序有一个"应该是静态的或可能发生泄漏"警告,它做到了。它使用40%CPU保持循环运行。

根据这个question,我将我的处理程序类改为

static class IncomingHandler extends Handler {
    private final WeakReference<MainActivity> mService; 

    IncomingHandler(MainActivity service) {
        mService = new WeakReference<MainActivity>(service);
    }
    @Override
    public void handleMessage(Message msg)
    {
         MainActivity service = mService.get();
         if (service != null) {
          if (flag) {
                kq += msg.obj.toString() + "\r\n";
                textResponse.setText(kq);
            }
         }
    }
}

它没有&#34;可能发生泄漏&#34;警告了,但现在出现了一个新问题:我无法从另一个班级引用IncomingHandler

public class ClientTask extends AsyncTask<String, String, String> implements
        OnListener {
////Some random code
    void sendMessage(String msg) {
        try {
                if (!msg.equals("bye"))
                MainActivity.IncomingHandler.obtainMessage(0, 0, -1, "Me: " + msg)
                        .sendToTarget();
            else
                MainActivity.IncomingHandler.obtainMessage(0, 0, -1,
                        "Disconnecting!").sendToTarget();
        } catch (Exception ioException) {
            ioException.printStackTrace();
        }
    }

现在它说&#34;非静态方法getsMessage不能从静态上下文引用“。但是使IncomingHandler非静态使整个事情毫无意义。无论如何我可以从静态上下文中使用obtainMessage吗?

EDIT1:我尝试添加static IncomingHandler incoming = new IncomingHandler(MainActivity.this);并使用MainActivity.incoming.obtainMessage();,但它说&#34; MainActivity.this无法从静态上下文中引用&#34;所以评论者&#39;建议不适合我。

EDIT2:我很愚蠢,我忘了删除&#34; MainActivity&#34;来自MainActivity.incoming.obtainMessage()。问题仍然存在。

1 个答案:

答案 0 :(得分:1)

创建IncomingHandler的对象,并在该对象上调用obtainMessage()

试试这段代码,

IncomingHandler incoming = new IncomingHandler(this);
incoming.obtainMessage();