#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.