最近在写的程序需要Service和Activity通信,于是想到将MainActivity里面的dataHandler改为static,再在Service里面调用sendMessage()方法。但是handler改为static后,makeText()又报错了,查了一些解决方法都没什么用,请问这个要怎么改?谢谢!
代码:
public static Handler dataHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
// 处理服务器返回的id,并分配给用户
try {
JSONObject jsonObject = new JSONObject(msg.obj.toString());
user.setId(jsonObject.getInt("id"));
Toast.makeText(MainActivity.this, "成功连接到服务器,id = " + user.getId(), Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
Toast.makeText(MainActivity.this, "用户id读取错误!", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
...
}
MainActivity.this 报错:No enclosing instance of the type MainActivity is accessible in scope
定义一个静态的activity,this.activity=this; 然后把toast里面 的第一个参数换成activity;
private static Activity ac;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ac = this;
}
public static Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Toast.makeText(ac, "用户id读取错误!", Toast.LENGTH_SHORT).show();
return false;
}
});
Service和Activity通信可以使用广播或者通过Binder对象通信的, 也非常方便。
MainActivity.this改成getApplicationContext
直接用this 啊,很明显,dataHandler在MainActivity中,handleMessage由MainActivity回调。
handler这样静态写不是会泄漏内存的么#132