Java Can';t在未调用Looper prepare的线程内创建处理程序
我想在调用函数时从服务中创建警报窗口Java Can';t在未调用Looper prepare的线程内创建处理程序,java,android,Java,Android,我想在调用函数时从服务中创建警报窗口 public class MyCustomService extends Service { private WindowManager windowManager; private ImageView chatHead; WindowManager.LayoutParams params; private static Context mContext; IBinder mBinder = new LocalBinder(); public st
public class MyCustomService extends Service {
private WindowManager windowManager;
private ImageView chatHead;
WindowManager.LayoutParams params;
private static Context mContext;
IBinder mBinder = new LocalBinder();
public static Socket client;
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public MyCustomService getServerInstance() {
return MyCustomService.this;
}
}
// Fires when a service is first initialized
public void onCreate() {
super.onCreate();
this.mContext = this;
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
}
// Fires when a service is started up
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
IO.Options opts = new IO.Options();
opts.query = "auth_token=51";
try {
client = IO.socket("http://192.168.0.106:3000/",opts);
client.on("message", onMessage);
client.connect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return START_STICKY;
}
@Override
public void onDestroy() {
client.disconnect();
client.close();
if (chatHead != null) windowManager.removeView(chatHead);
}
public void addView()
{
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(mContext);
chatHead.setImageResource(R.drawable.android_head);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(chatHead, params);
}
private Emitter.Listener onMessage = new Emitter.Listener() {
@Override
public void call(Object... args) {
addView();
}
};
}
表单onCreat
服务其工作没有任何错误
但是当我想从另一个函数调用它时
addView
当我向套接字发送新数据时调用此函数,所以我只想
警报窗口
当我从套接字收到消息时,如果调用函数addView
表单onMessage
函数
错误是什么
无法在未调用Looper.prepare()的线程内创建处理程序
但是如果我从
onMessage
服务的工作公共无效调用(对象…args)
不是从UI线程调用的。你可以通过电脑来做
公共无效调用(对象…参数)
不是从UI线程调用的。你可以通过电脑来做
onCreate
Handler mHandler = new Handler(Looper.getMainLooper());
...
...
...
private Emitter.Listener onMessage = new Emitter.Listener() {
@Override
public void call(Object... args) {
mHandler.post(new Runnable(){
@Override
public void run (){
addView();
}
});
};