安卓:我怎样才能显示从远程服务正在运行的线程举杯? [英] Android: How can i show a toast from a thread running in a remote service?

查看:105
本文介绍了安卓:我怎样才能显示从远程服务正在运行的线程举杯?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

安卓:我怎样才能显示从远程服务正在运行的线程举杯?每当我从一个不同的线程在服务运行时,应用程序崩溃...

Android: How can i show a toast from a thread running in a remote service? Whenever i run from a different thread in a service, the app crashes...

public class BroadcastService extends Service {

private static final String TAG = BroadcastService.class.getSimpleName();
private MessageFormatter mFormatter = new MessageFormatter();
private BroadcastComm broadCastComm = new BroadcastComm();
private Task commTask = new Task();
private volatile static boolean stopBroadcastRequested = false;
private volatile static boolean isSocketOpen = false;
private volatile static byte[] messageToBeSent;
private Handler serviceHandler;
private ConnectivityStatus connStatus;


@Override
public void onCreate() {
    super.onCreate();
    Log.e(TAG, "Service creating");
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    serviceHandler = new Handler();
    serviceHandler.post(commTask);
    stopBroadcastRequested = false;
    messageToBeSent = mFormatter.formBroadCastMessage("GET_PERIPH_DATA");
}


class Task implements Runnable{

    @Override
    public void run() {
        while(!stopBroadcastRequested){
                           Toast.makeText(context, "SSSSSSSSSS", 5).show();
            Log.i(TAG, "Thread Task started");          
            try {
                Log.d("SERVICE CLASS", "STARTED THREAD - Writing in output stream");
                isSocketOpen = broadCastComm.isAliveOrOpenSocket("192.168.43.2", 6000, 17, 0);

                if(isSocketOpen){
                    OutputStream outStream = broadCastComm.getCurrentOutputStream();

                    outStream.write(messageToBeSent);
                    if(Integer.valueOf(messageToBeSent[2]) != (byte)0xA0){
                        Log.e("REVERTING", "REVERTING");
                        messageToBeSent = mFormatter.formBroadCastMessage("GET_PERIPH_DATA");
                    }

                    Log.d("OUTPUT STREAM", "Message sent ->" + ByteArrayToString(messageToBeSent));
                }

                Thread.sleep(3000L);
                if(isSocketOpen){
                    Log.d("SERVICE CLASS", "Started input");
                    InputStream inStream = broadCastComm.getCurrentInputStream();
                    BufferedInputStream buf = new BufferedInputStream(inStream);
                    byte[] buffer;

                    while(buf.available() > 0){
                        Log.d("SERVICE CLASS", "Input available");
                        int size = buf.available();
                        buffer = new byte[size];
                        inStream.read(buffer, 0, size);
                        if(buffer[2] == (byte)0xA0){
                            BroadcastPacket packet = broadCastComm.decodeSocketData(buffer);
                            synchronized (incomingPacketLock) {
                                latestBroadcastPacket = packet;
                            }
                            synchronized (listeners) {
                                for (BroadcastListener listener : listeners) {
                                    try {
                                        listener.handlePacketsUpdated();
                                    } catch (RemoteException e) {
                                        Log.w(TAG, "Failed to notify listener " + listener, e);
                                    }
                                }
                            }
                        }
                    }
                }

            } catch (Throwable t) { 
                Log.e(TAG, "Failed to retrieve data in thread", t);
            }
            Log.d("SERVICE CLASS", "End of THREAD");

        }
        if(stopBroadcastRequested){
            Log.e("SERVICE", "STOPPED THREAD");
        }
    }

    public synchronized void stopThread(){
        stopBroadcastRequested = true;
    }

}

     ...........

@Override
public IBinder onBind(Intent intent) {
    if (BroadcastService.class.getName().equals(intent.getAction())) {
        Log.d(TAG, "Bound by intent " + intent);
        return apiEndpoint;
    } else {
        return null;
    }
}


   .........

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e(TAG, "Service destroying");
    stopBroadcastRequested = true;
    broadCastComm.clearConnections();
    try {
        serviceHandler.removeCallbacks(commTask);
        serviceHandler = null;

    } catch (Exception e) {
        Log.d("SERVICE", "FAILED TO REMOVE CALL BACKS");
    }

    commTask.stopThread();
    //currentThread = null;
}

}

推荐答案

这是我做到了。当然,你需要通过适当的范围内。

This is how I did it. Of course, you need to pass appropriate context.

   Handler h = new Handler(context.getMainLooper());

    h.post(new Runnable() {
        @Override
        public void run() {
             Toast.makeText(context,message,Toast.LENGTH_LONG).show();
        }
    });

这篇关于安卓:我怎样才能显示从远程服务正在运行的线程举杯?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆