相关疑难解决方法(0)

如何修复android.os.NetworkOnMainThreadException?

我在为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)

我该如何解决这个问题?

java android android-networking networkonmainthread

2308
推荐指数
40
解决办法
115万
查看次数

Android - android.os.NetworkOnMainThreadException

我有这个例外,我正在阅读这个问题的线程,这看起来很混乱:

如何修复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)

android networkonmainthread

48
推荐指数
4
解决办法
17万
查看次数

Android RxJava,非阻塞?

据我所知,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)

我在这里错过了什么吗?

android rx-java

9
推荐指数
1
解决办法
4429
查看次数

Observable订阅rxjava时的NetworkOnMainThreadException

我正在使用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.我不知道如何解决它.

java android observable rx-java rx-java2

-3
推荐指数
1
解决办法
352
查看次数