我刚刚在官方文档中发现了NetworkOnMainThreadException
并想知道模拟器是否抛出这个.我一直在测试我的应用程序,据我所知,所有网络都是主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否有人没有逃脱.
我也在使用StrictMode并且没有看到任何东西.
我的代码是干净的还是不会在模拟器上抛出?
我们应该如何为生产中的这种情况做好准备?
宽限期或其他什么?或者现在已经过去了;-) ??
networking android asynchronous android-asynctask networkonmainthread
我意识到我在MainThread上使用了subscribeOn()/ observeOn().我可以传递给subscribeOn()的选项有哪些?我可以传递给observeOn()的选项有哪些?
12-17 21:36:09.154 20550-20550/rx.test D/MainActivity2: [onCreate]
12-17 21:36:09.231 20550-20550/rx.test D/MainActivity2: starting up observable...
12-17 21:36:09.256 20550-20550/rx.test D/MainActivity2: [onError]
12-17 21:36:09.256 20550-20550/rx.test W/System.err: android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)
GovService.java
import java.util.List;
import retrofit.Call;
import retrofit.http.GET;
import rx.Observable;
public interface GovService {
@GET("/txt2lrn/sat/index_1.json")
Observable<MyTest> getOneTestRx();
}
Run Code Online (Sandbox Code Playgroud)
MyTest.java
public class MyTest {
private String name, url;
private int num;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) …Run Code Online (Sandbox Code Playgroud) 我无法实现rxJava以检查android上是否有互联网连接我这样做:
在我的启动器活动中,我在onCreate中有这个:
AndroidObservable.bindActivity(this,
Observable.just(Utils.isActiveInternetConnection(Launcher.this)))
.subscribeOn(Schedulers.newThread())
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
if (aBoolean) {
Toast.makeText(Launcher.this, "There is internet connection", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(Launcher.this, "There is no internet connection", Toast.LENGTH_SHORT).show();
}
}
});
Run Code Online (Sandbox Code Playgroud)
我有一个Utils类,它是一个带有静态方法的final类,observable使用的方法是这样的:
public static boolean isActiveInternetConnection(Context context) {
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e("network", "Error checking internet connection", e);
}
} else {
Log.d("network", …Run Code Online (Sandbox Code Playgroud) 据我所知,rxjava-android在一个单独的线程上执行操作(当提供正确的调度程序时),导致非阻塞操作,但是快速而肮脏的测试似乎证明这是不正确的.
我使用了以下代码片段,在两种情况下,UI都被阻止了......
片段1
Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
int i = 0;
while (i == 0) {}
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();
Run Code Online (Sandbox Code Playgroud)
片段2
Observable observable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
SystemClock.sleep(5000);
subscriber.onCompleted();
}
});
observable.subscribeOn(Schedulers.newThread());
observable.observeOn(AndroidSchedulers.mainThread());
observable.subscribe();
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我最近从retroft-beta1升级,这是有效的.我有以下API接口:
public interface Service {
@POST("path")
Observable<Object> service();
}
Run Code Online (Sandbox Code Playgroud)
以下电话:
service.service()
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
Run Code Online (Sandbox Code Playgroud)
它会抛出NetworkOnMainThreadException.但这是在改造beta1.