Есть ли способ, где я могу вызвать вызов API сети в главном потоке в Android Honeycomb? - PullRequest
4 голосов
/ 02 сентября 2011

Я создаю сервис и приложение. Приложение может вызывать метод службы. Метод вызывает API и основывается на API, давая результат. Поскольку приложение предназначено для Android 3.0, я получаю «NetworkOnMainThreadException».

Мое требование заключается в том, чтобы я не мог вызвать метод в фоновом потоке из приложения. Также метод на службе должен возвращать логическое значение на основе вызова API.

есть ли способ, где я могу вызвать вызов сетевого API в главном потоке в сотах Android?

Ответы [ 3 ]

27 голосов
/ 23 января 2013
import android.os.StrictMode;

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
7 голосов
/ 02 сентября 2011

Я создаю службу и приложение.

Служба является частью "приложения".Я собираюсь предположить, что вы имели в виду «активность», где вы написали «приложение».

Мое требование заключается в том, чтобы я не мог вызвать метод в фоновом потоке из приложения.

Тогда тот, кто создал это «требование», идиот и должен быть уволен.Затем удалите это требование.Всегда выполняйте сетевые операции в фоновом потоке.

Поскольку приложение предназначено для Android 3.0, я получаю «NetworkOnMainThreadException».

Это потому, что StrictMode включенопредупредить вас об этих вещах по умолчанию.Хотя это новое предупреждение, проблема существует во всех версиях Android, на которых работает ваш код.

Есть ли способ, с помощью которого я могу вызвать вызов сетевого API в главном потоке в android honeycomb?

Это никогда не должно быть сделано в рабочем коде.Переработайте ваше приложение, чтобы выполнить сетевой ввод-вывод в фоновом потоке (например, AsyncTask).

2 голосов
/ 02 сентября 2011

Только примечание: выполнение синхронных вызовов в потоке пользовательского интерфейса - ужасная практика программирования для рабочего кода - вы должны всегда делать асинхронный вызов в фоновом потоке и никогда не вызывать псевдосинхронный вызов в как показано ниже.

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

final Object lock = new Object();
new Thread(new Runnable() {
    public void run() {
        synchronized(lock) {
            // Perform call
            // lock.notify();
        }
    }
}).start();
synchronized(lock) {
    try {
        lock.wait();
    }
    catch{}
}
...