나는 그 안에 ResultReceiver가있는 BroadcastReceiver를 사용하는 방법에 대해 질문합니다.BroadcastReceiver와 ResultReceiver 및 평생
"A BroadcastReceiver가 10 초 내에 실행을 완료하지 못했습니다."라는 사실을 알고 있습니다. ANR이 있습니다.
나는 Manifest에 선언 된 Intent에 응답하는 응용 프로그램을 가지고 있습니다.
이public class MyReceiver extends BroadcastReceiver {
private Context context = null;
private MyResultReceiver myResultReceiver = null;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
myResultReceiver = new MyResultReceiver(new Handler());
Intent i = new Intent();
i.setClass(context, MyService.class);
i.putExtra(Constants.EXTRA_RESULT_RECEIVER, myResultReceiver);
context.startService(i);
}
public class MyResultReceiver extends ResultReceiver {
public MyResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == 42) {
// Something
} else {
// Something else
}
}
}
}
내 서비스는 다음과 같습니다 :
public class MyService extends Service {
private Context context = null;
private ResultReceiver resultReceiver = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.context = this;
resultReceiver = intent.getParcelableExtra(Constants.EXTRA_RESULT_RECEIVER);
MyTask myTask = new MyTask();
myTask.execute();
return super.onStartCommand(intent, flags, startId);
}
public class MyTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
// Network operation
return status;
}
@Override
protected void onPostExecute(final Boolean status) {
Bundle bundle = new Bundle();
if (status == true) {
if (resultReceiver != null) {
resultReceiver.send(42, null);
}
} else {
if (resultReceiver != null) {
resultReceiver.send(-1, null);
}
}
}
}
}
내 질문은, 내가 확인 resultReceiver이 여전히 존재한다는 생각은 일부 네트워크 작업을해야하기 때문에 그것은 서비스을 (를) 브로드 캐스트 리시버 시작된다 네트워크 작업이 10 초보다 길면 어떻게해야할까요?
"결론"- 1. OP * IS *는 'startService (...)'를 사용합니다. 2. 영업 이익은 이것을 압니다. 따라서 질문입니다. 3. OP * IS *는 '서비스'를 사용합니다. 시피'Service '에서'AsyncTask'를 사용하는 것은 무의미합니다 (AsyncTask는 UI와 상호 작용하도록 설계되었습니다). 그렇더라도'AsyncTask'는'Service'에서 파괴 될 확률이 훨씬 적습니다. 활동 중. – Squonk
@Squonk이 말했듯이이 대답은 나를 돕지 않습니다. 하지만 노력해 줘서 고마워. – ldemay