#android #pojo
#Android #pojo
Вопрос:
Я пытаюсь создать проект Android, содержащий общий код, который будет использоваться другими. В этом проекте у меня есть только POJO и нет классов, специфичных для Android.
Некоторые функции требуют вызова некоторых действий и зависят от результата. Мои классы POJO получают ссылку на вызывающее действие при использовании, но это происходит во время выполнения, и я не могу контролировать реализацию этих действий.
Моя проблема в том, что со ссылкой на вызывающее действие я могу запустить activityforresult, но у меня нет способа добавить onActivityResult , который может существовать в вызывающем действии, но не знает о коде запроса, который я использовал.
Тогда мой вопрос заключается в том, как я узнаю из обычного объекта Java, когда действие вернулось? поскольку, насколько я понимаю, я могу реализовать onActivityResult только для классов Activity.
Спасибо!
Ответ №1:
У вас будет немало проблем с этой настройкой, но именно так вы можете начать:
Вам нужно будет включить в свой проект действие, которое не делает ничего, кроме запуска действия, из которого вы хотите получить результат, и сохраняет его в глобально доступном хранилище (например, в одноэлементном или статическом поле).
class Pojo {
static final ConditionVariable gate = new ConditionVariable();
static int resu<
int m(Context context) {
context.startActivity(new Intent(context, ForwarderActivity.class));
gate.block();
return resu<
}
}
class ForwarderActivity extends Activity {
private boolean started = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!started) {
started = true;
startActivityForResult(new Intent("ContactsProvider"), 1);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Pojo.result = resultCode;
Pojo.gate.open();
}
}
Однако есть пара проблем. Например, ваш метод POJO не может быть вызван из основного потока (пользовательского интерфейса), потому что вам нужно преобразовать асинхронный вызов (startActivityForResult() ) в синхронный (Pojo.m()), и действие, от которого вы хотите получать информацию, будет запущено в основном потоке, поэтому выне удается заблокировать его в Pojo.m()…
В любом случае, код не работает, но вы можете увидеть, в какую сторону идти, если вам действительно нужно придерживаться этой настройки. Но вы действительно должны попытаться придумать какие-то другие способы извлечения данных, например, поставщика контента.
Ответ №2:
у меня такая же проблема, когда я играю с UNITY3D, у unity есть своя собственная активность (unity player), я по какой-то причине не хочу ее редактировать. но активность игрока ничего не делает внутри функции «onActivityResult». И мне нужно кое-что сделать, когда я получаю доступ к средству выбора изображений, я могу вызвать «UnityPlayer.startActivityForResult», чтобы открыть средство выбора изображений, но НЕТ СПОСОБА ЗАКОДИРОВАТЬ СВОЙ СОБСТВЕННЫЙ «onActivityResult».
я думаю, мы надеемся, что это что-то вроде этого:
OtherActivityClass.onActivityResultListener=function(){My Own CODE}..........OR
OtherActivityClass.onActivityResultListener.add(myResultListener)..................
Ответ №3:
Тогда мой вопрос заключается в том, как я узнаю из обычного объекта Java, когда действие вернулось?
Пусть действие вызывает POJO, предоставляя результат.
Мои классы POJO получают ссылку на вызывающее действие при использовании, но это происходит во время выполнения, и я не могу контролировать реализацию этих действий.
Тогда тот, кто «контролирует выполнение этих действий», должен будет заставить activity вызывать POJO, предоставляя результат. Это ничем не отличается от любого другого механизма обратного вызова / прослушивания.
Комментарии:
1. Ну, у меня есть некоторые неприятные ограничения, с которыми мне нужно разобраться.. все, что когда-либо использует мой POJO, для меня похоже на черный ящик, все, что я знаю, это то, что он вызывает методы в моих POJO и, в свою очередь, ожидает результата. Что касается действий, которые я хочу вызвать из моего POJO, это действия, существующие на устройстве Android, которые также находятся вне моего контроля.. Мне просто нужно позвонить им (скажем, получить контакт) и получить результат. Спасибо.
2. @Nitzan Tomer: «У меня есть некоторые неприятные ограничения, с которыми мне нужно разобраться» — эти ограничения необходимо будет снять. Вы не можете использовать
startActivityForResult()
, кроме как из какой-либо вашей деятельности, где вы реализуетеonActivityResult()
.
Ответ №4:
Может быть, PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html могу помочь вам в этом. Я все еще ищу решение своей проблемы, и для меня этот класс выглядит довольно многообещающим.
Другим способом может быть создание собственного абстрактного класса и метод onActivityResult
, который необходимо переопределить. Конечно, вам придется полагаться на JavaDoc и «пожалуйста, вызовите super.onActivityResult», чтобы иметь возможность обрабатывать результат в вашем коде. Но если пользователи вашего класса хотят добиться некоторого успеха с вашим кодом, они должны следовать вашим инструкциям JavaDoc.
Ответ №5:
Подобно тому, что предлагает Сабольч Береч, это возможно. Красивого решения не существует, но возможно следующее:
- создайте простое действие без просмотра, которое запускает для вас намерение
- распределите результат через глобальный менеджер прослушивателей, где заинтересованные классы могут самостоятельно регистрироваться и отменять регистрацию (например, POJO)
- это неблокирующее, но
startActivityForResult
и ожидание его результата вообще не блокируется
Я настроил это в библиотеке для настроек приложения, и некоторые настройки запускают системное намерение (например, выберите изображение) и должны ждать их результата, и это работает даже после поворота экрана без необходимости каких-либо настроек кода пользователем библиотек.