【发布时间】:2019-06-29 09:39:40
【问题描述】:
为什么handleMessage 在ui 线程中运行,而我使用后台线程looper 创建处理程序?这个looper不属于ui线程,但是alertdialog正确显示并且没有崩溃,同时应该给出一个错误。
如果问题不清楚,请原谅,因为我不太懂英语
public class ToastService extends Service {
private HandlerThread thread;
private Looper looper;
ServiceHandler handler;
public static int num=0;
int idd=0;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("say","created");
thread=new HandlerThread("mhm", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
looper=thread.getLooper();
handler=new ServiceHandler(looper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int messageIntent=0;
if (intent!=null){
messageIntent=intent.getIntExtra("myMessage",0);
Log.i("sayonStartCommand",messageIntent+"");
}
Toast.makeText(this, "ook", Toast.LENGTH_SHORT).show();
Message message=new Message();
idd=messageIntent;
message.what=0;
message.arg1=startId;
Bundle bundle=new Bundle();
bundle.putInt("say",messageIntent);
message.setData(bundle);
handler.sendMessage(message);
return START_STICKY;
}
@Override
public void onDestroy() {
Log.i("say","finish xxxxxxxxxxxxxxxxxx");
super.onDestroy();
}
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
new AlertDialog.Builder(MainActivity.mcontext)
.setTitle("ok")
.setMessage("message").show();
int i=msg.getData().getInt("say");
Log.i("say",i+"");
if (idd==3){
stopSelf(msg.arg1);
}
}
}
}
【问题讨论】:
-
你找到解决办法了吗?
-
很遗憾,我没有找到解决办法,也没有人知道原因。
标签: java android multithreading