Android:如何从远程服务中运行的线程显示吐司?

时间:2011-05-26 05:19:13

标签: android android-service

Android:我怎样才能在远程服务中运行的线程中显示吐司?每当我从服务中的不同线程运行时,应用程序崩溃......

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;
}

}

4 个答案:

答案 0 :(得分:45)

这就是我做的。当然,您需要传递适当的上下文。

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

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

答案 1 :(得分:2)

如果有人不明白@Alex Gitelman答案中的上下文。编写您的类名来代替您正在编写此处理程序代码的上下文,如此

Handler h = new Handler(MyClassName.this.getMainLooper());

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

答案 2 :(得分:0)

我不确定,但这看起来又像是在非GUI线程上调用GUI方法。

答案 3 :(得分:0)

尝试的另一种方法是使用AsyncTaskThis Android article是一个关于线程的好文章。