Сообщение об активности из AsyncTask

#android

#Android

Вопрос:

Я пытаюсь отправить сообщение для моего основного действия из асинхронной задачи, встроенной в службу. В принципе, асинхронная задача должна блокироваться при вводе, и она не может выполняться в основном потоке активности (блокировка была удалена из примера кода ниже). Однако, когда данные поступают, мне нужно отправить их в основное действие. Я обнаружил, что сообщения, отправленные ниже, никогда не доходят. Если ответом является перемещение привязки в асинхронной задаче, как вы это делаете? Указание на пример кода было бы большой помощью, если это возможно.

 public class InputService2 extends Service {
int bufferSize = 1024;
Process process;
DataInputStream os;
TextView inputView;
byte[] buffer = new byte[bufferSize];
private MyAsyncTask inputTask = null;
       public void onCreate(){
           inputTask = new  MyAsyncTask();
           inputTask.execute((Void[])null);

       }
       private class MyAsyncTask extends AsyncTask<Void,Void,Void> {

        int mValue = 0;
        static final int MSG_SET_VALUE = 3;
            protected void onProgressUpdate(Void progress){

            }

            protected void onPostExecute(Void result) {

            }

            protected Void doInBackground(Void... params) {

                int i = 0;


                try {
                    mValue = 0x23;
            Message message =     Message.obtain(null,MSG_SET_VALUE,mValue,0);
                    mMessenger.send(message);
                }
                catch (Exception e) {

                }


            }
        } 
       class IncomingHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
            }
        }
        final Messenger mMessenger = new Messenger(new IncomingHandler());
        public IBinder onBind(Intent intent) {
            return mMessenger.getBinder();
        } 

}
  

Ниже приведена внутренняя часть действия:

 class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        Context context = getApplicationContext();
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(context, msg.arg1, duration);
        toast.show();
    }
}

boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        // This is called when the connection with the service has been
        // established, giving us the object we can use to
        // interact with the service. We are communicating with the
        // service using a Messenger, so here we get a client-side
        // representation of that from the raw IBinder object.
        mService = new Messenger(service);
        mBound = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        // This is called when the connection with the service has been
        // unexpectedly disconnected -- that is, its process crashed.
        mService = null;
        mBound = false;
    }
};

protected void onStart() {
    super.onStart();
    // Bind to the service
    bindService(new Intent(this, InputService2.class), mConnection,
            Context.BIND_AUTO_CREATE);
}
  

Ответ №1:

Похоже, вы основали свой пример на ссылке javadoc наhttp://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample, однако вы упустили большую часть деталей реализации, которые на самом деле заставляют ее работать. Вы должны вернуться назад и реализовать полную функциональность, упомянутую в этом примере, чтобы использовать этот конкретный шаблон: обратите пристальное внимание на разделы реализации REGISTER_CLIENT и UN_REGISTER_CLIENT в классе IncomingHandler, поскольку это биты, которые фактически гарантируют, что сообщение может быть передано из службы в Activity.