有没有一种方法可以在 android honeycomb 的主线程上调用网络 API 调用?

发布于 2024-12-02 19:05:39 字数 236 浏览 1 评论 0原文

我正在创建一项服务和一个应用程序。应用程序可以调用服务上的方法。该方法调用API并基于API给出结果。由于该应用程序面向 android 3.0,因此我收到“NetworkOnMainThreadException”。

我的要求是这样一种方式,我无法从应用程序调用后台线程中的方法。此外,服务方法应根据 API 调用返回一个布尔值。

有没有一种方法可以在 android honeycomb 的主线程上调用网络 API 调用?

I am creating a service and an app. App can call a method on a service. The method is calling an API and based on API, giving the result. Since the app is targetting android 3.0, I am getting "NetworkOnMainThreadException".

My requirement is such a way that I cannot call the method in background thread from app. Also the method on service should return a boolean based on API call.

is there a way where I can call an network API call on main thread in android honeycomb?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

知你几分 2024-12-09 19:05:39
import android.os.StrictMode;

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
import android.os.StrictMode;

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
宛菡 2024-12-09 19:05:39

我正在创建一项服务和一个应用程序。

服务是“应用程序”的一部分。我假设你的意思是你写“应用程序”的地方的“活动”。

我的要求是我不能从应用程序调用后台线程中的方法。

那么提出这个“要求”的人就是个白痴,应该被解雇。然后,删除此要求。始终在后台线程上执行网络操作。

由于该应用程序面向 android 3.0,因此我收到“NetworkOnMainThreadException”。

这是因为默认情况下 StrictMode 会针对这些情况向您发出警告。虽然警告是新的,但运行代码的所有 Android 版本都存在该问题。

有没有办法可以在 android honeycomb 的主线程上调用网络 API 调用?

这绝对不应该在生产代码中完成。重新设计您的应用程序以在后台线程上执行网络 I/O(例如,AsyncTask)。

I am creating a service and an app.

A service is a part of an "app". I am going to assume that you meant "activity" where you wrote "app".

My requirement is such a way that I cannot call the method in background thread from app.

Then whoever created this "requirement" is an idiot and should be fired. Then, remove this requirement. Always perform network operations on a background thread.

Since the app is targetting android 3.0, I am getting "NetworkOnMainThreadException".

That is because StrictMode is on to warn you about these things by default. While the warning is new, the problem exists on all versions of Android your code is running on.

is there a way where I can call an network API call on main thread in android honeycomb?

This should never be done in production code. Rework your application to do the network I/O on a background thread (e.g., AsyncTask).

爱殇璃 2024-12-09 19:05:39

请注意:在 UI 线程上进行同步调用对于生产代码来说是可怕的编程实践 - 您应该始终在后台线程中进行异步调用,而不必以所示方式强制进行伪同步调用以下。

事实上,我发布此内容只是因为当我在 UI 线程上使用 AndroidHttpClient 进行网络调用以在完成实现之前进行简短的功能测试时,API 会引发异常,这让我感到恼火。 IE。测试用于后台线程的操作,而无需添加琐碎的代码,以便在您不需要它时使其成为后台线程。

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{}
}

Just a note: making synchronous calls on the UI thread is horrible programming practice for production code - you should always make asynchronous call in a background thread and never have to force a psuedo-synchronous call in the manner shown below.

In fact, I'm only posting this because I'm miffed that the API throws an exception when I make a network call using the AndroidHttpClient on the UI thread for brief functional testing before complete implementation. Ie. Testing an operation meant for a background thread without adding frivolous code to make it a background thread when you don't yet need it.

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{}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文