【问题标题】:Toast not displayed in bound service example using messenger使用信使的绑定服务示例中未显示 Toast
【发布时间】:2014-09-18 13:43:22
【问题描述】:

我正在遵循 android guide for bound service using messenger 的示例并运行以下代码 sn-p。 我稍微修改了 sn-p 以具有一个 hi 和一个 bye 按钮,并且服务应该根据 UI 上按下的按钮显示 toast hi 或 bye。

但在运行示例 toast 时不显示。虽然消息接收日志打印在 UI 上。

这是什么原因。 onStart of Acticity 的 toast 也不会显示。

public class MessengerService extends Service {
    public final static int MSG_SAY_HELLO = 1;
    public final static int MSG_SAY_BYE = 2;

    final Messenger mMessenger = new Messenger(new IncomingHandler());

    public static final String LOG_TAG = MessengerService.class.getName();

    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(this, "binding", Toast.LENGTH_SHORT);
        return mMessenger.getBinder();
    }

    public class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message message) {
            Log.d(LOG_TAG, "new msg arrived");
            switch (message.what) {
                case MSG_SAY_HELLO:
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT);
                    break;
                case MSG_SAY_BYE:
                    Toast.makeText(getApplicationContext(), "bye!", Toast.LENGTH_SHORT);
                    break;
                default:
                    super.handleMessage(message);
            }
        }
    }
}

public class MyActivity extends Activity {

    Messenger mServiceMessenger = null;
    boolean mBound = false;

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName componentName, IBinder binder) {
            mServiceMessenger = new Messenger(binder);
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mBound = false;
            mServiceMessenger = null;
        }
    };

    private void sayHello() {
        if(mBound){
            Message msg  = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
            try{
                mServiceMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        } else {
            Toast.makeText(this, "not bound yet", Toast.LENGTH_SHORT);
        }
    }

    public void sayBye() {
        if(mBound) {
            Message msg  = Message.obtain(null, MessengerService.MSG_SAY_BYE, 0, 0);
            try {
                mServiceMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        } else {
            Toast.makeText(this, "not bound yet", Toast.LENGTH_SHORT);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Toast.makeText(this, "binding", Toast.LENGTH_SHORT);
        bindService(new Intent(this, MessengerService.class), mServiceConnection,
                Context.BIND_AUTO_CREATE);
    }

    protected void onStop() {
        super.onStop();
        unbindService(mServiceConnection);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        Button hi = (Button)findViewById(R.id.hello_world);
        Button bye = (Button)findViewById(R.id.bye_world);
        hi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sayHello();
            }
        });
        bye.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sayBye();
            }
        });
    }

}

【问题讨论】:

    标签: android android-toast android-service-binding


    【解决方案1】:

    您忘记调用show() 方法 试试这个代码片段。

    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show()
    

    【讨论】:

    • 经典菜鸟错误!我几乎总是这样做。感谢您指出。
    【解决方案2】:

    据我所知,您没有调用 show 方法。尝试像这样更改代码:

    Toast.makeText(this, "not bound yet", Toast.LENGTH_SHORT).show();
    

    【讨论】:

    • 经典菜鸟错误!我几乎总是这样做。感谢您指出。
    【解决方案3】:

    你忘了在 Toast 链的末尾调用“.show()”方法:

    Toast.makeText(this, "not bound yet", Toast.LENGTH_SHORT).show();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2023-03-28
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多