我在为RssReader运行我的Android项目时遇到错误.
码:
URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
Run Code Online (Sandbox Code Playgroud)
它显示以下错误:
android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我有这个例外,我正在阅读这个问题的线程,这看起来很混乱:
如何修复android.os.NetworkOnMainThreadException?
我已将此行添加到我的清单中:
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)
在讨论中,他们讨论了应用程序无法进行网络连接的主要执行线程.我想知道的是如何重构我的代码,以便它与Android良好实践一致.
这是我的Activity类:
package com.problemio;
import java.io.InputStream;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class LoginActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
// Show form for login_email
final EditText loginEmail = (EditText) findViewById(R.id.login_email);
String name = loginEmail.getText().toString();
// Show field for password
final EditText password …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)
我在这里错过了什么吗?
我正在使用Rxjava2,
我flatmap在RxJava中使用以下结构:
Observable1.flatmap() 并返回Observable 2.
如下代码:
getApi().createUser(os, deviceToken)
.compose(view.regisObserver())
.subscribeOn(Schedulers.io())
.flatMap(result -> {
String user_token = result.data.user_token;
getPreferenceStore().setAuthToken(user_token);
setReadPolicy();
Observable<ObjectDto<UserProfile>> obs = getApi().updateProfile(null, null, null);
obs.compose(view.regisObserver());
return obs;
})
.subscribe(result-> {
getPreferenceStore().setUserId(result.data.user_id);
// view.onUpdateProfile();
}, Throwable::printStackTrace);
@Override
public <T> ObservableTransformer<T, T> regisObserver() {
return observable -> observable.compose(prepare())
.doOnSubscribe(disposable -> showProgressDialog())
.doOnComplete(this::closeProgressDialog)
.doOnError(throwable -> {
if (BuildConfig.DEBUG) {
throwable.printStackTrace();
}
showProgressDialog();
closeProgressDialog();
});
}
Run Code Online (Sandbox Code Playgroud)
代码编译没有错误.它在运行时出错NetworkErrorOnMainThread.我不知道如何解决它.