PhoneGap android: получение не может создать обработчик внутри потока, который не вызвал Looper.prepare () - PullRequest
0 голосов
/ 20 декабря 2011

Я создал плагин PhoneGap для Android, который отправляет email.

public PluginResult execute(String action, JSONArray args, String callbackId) {
    try {
        // i want to call a function from other class so i did the
        // below, but it is throwing  the above said error...

        WebActivity wb = new WebActivity();
        wb.createExternalStoragePrivateFile(img);

        //sending email code here
    }
}

В приведенном выше коде при доступе к функции другого класса я получаю сообщение об ошибке:

не может создать handler внутри потока, который не вызвал Looper.prepare() error.

Каков правильный подход к вызову функции?

1 Ответ

1 голос
/ 20 декабря 2011

Если WebActivity на самом деле является деятельностью (то есть расширяет Activity), вы ошибаетесь в нескольких вещах.


Вы не должны создавать Activity объекты самостоятельно. Ну, вы можете, но чем вы должны назначить им контекст (что, я не уверен, даже возможно без использования внутренних компонентов), и управлять жизненным циклом Activity.

Вы не можете просто создать объект Activity и вызвать функцию. Эта функция может иметь жизненный цикл и контекстные зависимости (т. Е. Вам может потребоваться «возобновить» действие).


Ошибка, которую вы видите, является результатом того, что каждый Activity ожидает вызова из UI-потока (или, по крайней мере, из Looper потока). Функция, которую вы вызываете больше всего, использует Handler в некотором роде, прямо или косвенно. И когда эта функция создает Handler, а затем отправляет сообщение или Runnable, вы получите сообщение об ошибке.

Но опять же, это потому, что Activity не предназначен для использования так, как вы использовали. Вы не можете просто создать действие и начать вызывать его метод. Вы в основном нарушаете его государственную модель. Так что Activity даже не должен работать.


В качестве решения, если у вас есть контроль над WebActivity, переместите функцию createExternalStoragePrivateFile() в некоторый независимый класс или сделайте его статическим (если это возможно), или и тем, и другим. Скорее всего, вам нужно починить там одну или две вещи, чтобы она заработала. Но, по крайней мере, вы сможете вызывать функцию из других мест.

...