GVKun编程网logo

错误android.os.networkonmainthreadexception asynctask getResponseCode(错误的英文)

13

关于错误android.os.networkonmainthreadexceptionasynctaskgetResponseCode和错误的英文的问题就给大家分享到这里,感谢你花时间阅读本站内容,更

关于错误android.os.networkonmainthreadexception asynctask getResponseCode错误的英文的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android HttpClient:NetworkOnMainThreadException、android – NetworkOnMainThreadException with retrofit-beta2和rxjava、android – RxJava 2 / Retrofit 2 – NetworkOnMainThreadException、android – RxJava和Retrofit2:NetworkOnMainThreadException等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

错误android.os.networkonmainthreadexception asynctask getResponseCode(错误的英文)

错误android.os.networkonmainthreadexception asynctask getResponseCode(错误的英文)

当我在同一个类上运行我的代码时app运行良好.但是当我在两个不同的类上运行此代码时,我的应用程序是错误 android.os.networkonmainthreadexception.
当debug我在responseHttp = httpconnection.getResponseCode()时检测到错误;
app run to line responseHttp = httpconnection.getResponseCode();然后它去捕捉{},取消“If..else”.并记录错误android.os.networkonmainthreadexception.
你能帮助我吗!!

我的代码类Asynctask

package com.example.finishdemo;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import android.os.AsyncTask;

public class TestConnectionNew extends AsyncTask<String,Void,String> {
private int responseHttp = 0;
private String flag="false";

@Override
protected String doInBackground(String... urltest) {
    // Todo Auto-generated method stub
    try {
        URL url = new URL(urltest[0]);
        URLConnection connection = url.openConnection();
        connection.setConnectTimeout(2000);
        HttpURLConnection httpconnection = (HttpURLConnection) connection;
        **responseHttp = httpconnection.getResponseCode();**
        if (responseHttp == HttpURLConnection.HTTP_OK) {
            flag = "true";
        } else {
            flag = "false";
        }
    } catch (Exception e) {
        e.printstacktrace();
        System.out.println("Thong bao loi: "+e.toString());
    }
    return flag;
}
}

代码类主要:

package com.example.finishdemo;
public class Hoadon extends Activity {
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hoadon);
    TestConnectionNew t=new TestConnectionNew();
    String recieve=t.doInBackground("http://longvansolution.tk/monthlytarget.PHP");
    if(recieve.equalsIgnoreCase("true"))
    {
        doTimerTask();
    }else
        if(recieve.equalsIgnoreCase("false"))
    {
        showAlert("Không kết nối được đến server hoặc thiết bị chưa có kết nối internet!");
    }

解决方法

使用 asynctask.execute执行AsyncTask而不是手动调用doInBackground:

TestConnectionNew t = new TestConnectionNew();
 t.execute("http://longvansolution.tk/monthlytarget.PHP");

将TestConnectionNew更改为

public class TestConnectionNew extends AsyncTask<String,String> {
private int responseHttp = 0;
private String flag="false";

@Override
protected String doInBackground(String... urltest) {
    // Todo Auto-generated method stub
    try {
        URL url = new URL(urltest[0]);
        URLConnection connection = url.openConnection();
        connection.setConnectTimeout(2000);
        HttpURLConnection httpconnection = (HttpURLConnection) connection;
        **responseHttp = httpconnection.getResponseCode();**
        if (responseHttp == HttpURLConnection.HTTP_OK) {
            flag = "true";
        } else {
            flag = "false";
        }
    } catch (Exception e) {
        e.printstacktrace();
        System.out.println("Thong bao loi: "+e.toString());
    }
    return flag;
}

@Override
     protected void onPostExecute(String recieve) {
           if(recieve.equalsIgnoreCase("true"))
            {
               doTimerTask();
           }else
           if(recieve.equalsIgnoreCase("false"))
             {
              showAlert("Không kết nối được đến server hoặc thiết bị chưa có kết nối internet!");
             }
      }
}

有关我们如何使用AsyncTask的更多帮助,请参阅:

http://developer.android.com/reference/android/os/AsyncTask.html

Android HttpClient:NetworkOnMainThreadException

Android HttpClient:NetworkOnMainThreadException

我在下面有一些代码:

protected void testConnection(String url) {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(url);
    ResponseHandler<String> responsehandler = new BasicResponseHandler();

    try {
        String connection = httpclient.execute(httpget, responsehandler);
        Toast.makeText(getBaseContext(), R.string.connection_succeed, Toast.LENGTH_SHORT).show();
        view_result.setText(connection);
    } catch(IOException e) {
        Toast.makeText(getBaseContext(), R.string.connection_Failed, Toast.LENGTH_SHORT).show();
    }
    httpclient.getConnectionManager().shutdown();
}

并在Menifest中添加权限:

<uses-permission android:name="android.permission.INTERNET"/>

但它是一个例外:
networkonmainthreadException,
我能怎么做?

解决方法:

在ICS及更高版本上,您无法再在UI线程上执行网络操作.相反,你被迫创建一个新的线程并在那里做你的网络.

可能的工具是Android的AsyncTask和普通的Java Thread.

可以在这里找到一个很好的教程:Android Threads, Handlers and AsyncTask – Tutorial

android – NetworkOnMainThreadException with retrofit-beta2和rxjava

android – NetworkOnMainThreadException with retrofit-beta2和rxjava

我最近从retroft-beta1升级,这是有效的.我有以下API接口:

public interface Service {
    @POST("path")
    Observable<Object> service();
}

以下电话:

service.service()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe();

它会抛出networkonmainthreadException.但这是在改造beta1.

解决方法:

从retrofit-beta2,调用Observable方法now behave synchronously.所以必须使用subscribeOn:

service.service()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe();

android – RxJava 2 / Retrofit 2 – NetworkOnMainThreadException

android – RxJava 2 / Retrofit 2 – NetworkOnMainThreadException

我需要执行请求,如果我的令牌过期,我需要刷新它并重试请求.

这就是我试图这样做的方式,此刻我可以刷新令牌,但它会抛出一个networkonmainthreadException.它完成了请求,更新令牌并到达日志,但是这个例外它杀了我.我怎么能避免这种情况?

public Observable<Estabelecimento> listarEstabelecimentos() {
    return Observable.defer(this::getListarEstabelecimentoObservable)
            .retrywhen(throwableObservable -> throwableObservable.flatMap(
                    throwable -> {
                        if (throwable instanceof UnauthorizedException) {
                            return mRequestManager.getTokenObservable(AutoAtendimentoApplication.getContext())
                                    .doOnNext(response -> /* log stuff */)
                                    .flatMap((Function<AuthResponse,ObservableSource<?>>) response2 ->
                                            getListarEstabelecimentoObservable()
                                                    .doOnNext(estabelecimento ->
                                                            /* log stuff */)
                                                    )
                                    );
                        }
                        return Observable.error(throwable);
                    }));
}

NetWorkErrorHandler:

public <T> T  processError(Response<T> response ) {
    switch (response.code()) {
        case 401:
            throw new UnauthorizedException();
        default:
            return response.body();
    }
}

令牌:

private Observable<AuthResponse> getToken(Context context,@GrantType.GrantTypeDef String grantType,@Nullable String refreshToken) {

    SessionManager sessionManager = SessionManager.getInstance(context);
    Usuario usuario = sessionManager.getUser();

    AuthRequest request = new AuthRequest(usuario.getUsername(),usuario.getpassword(),grantType,refreshToken);

    return mAuthAPIService.getToken(request)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .map(response -> storetokens(response,context));
}

编辑1:我很确定问题发生在flatmap中并且put subscriOn没有解决问题

编辑2:代码更新

解决方法

您的网络正在主线程上运行,您可以通过将observeOn(AndroidSchedulers.mainThread())和subscribeOn(Schedulers.io())添加到您的observable来解决它.

observeOn(…)表示结果在指定的线程上发出 – 在这种情况下是UI线程.

subscribeOn(…)调用基本上是处理请求的地方.如果省略,则在当前线程上完成计算.

android – RxJava和Retrofit2:NetworkOnMainThreadException

android – RxJava和Retrofit2:NetworkOnMainThreadException

我意识到我在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

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();
}

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) {
        this.url = url;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Name: " + this.name + ", num: " + this.num + ", url: " + this.url;
    }
}

MainActivity2.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.linearlayoutmanager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;

import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
import retrofit.RxJavaCallAdapterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class MainActivity2 extends AppCompatActivity {
    private final String TAG = getClass().getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "[onCreate]");
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        RecyclerView mRV = (RecyclerView) findViewById(R.id.rv);
        mRV.setLayoutManager(new linearlayoutmanager(this));// setup LayoutManager
        mRV.setItemAnimator(new DefaultItemAnimator());// setup ItemAnimator

        // setup retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://goanuj.freeshell.org")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        GovService service = retrofit.create(GovService.class);

        Log.d(TAG, "starting up observable...");
        Observable<MyTest> o = service.getoneTestRx();
        o.subscribeOn(Schedulers.io());
        o.observeOn(AndroidSchedulers.mainThread());
        o.subscribe(new Subscriber<MyTest>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "[onCompleted] ");
            }

            @Override
            public void one rror(Throwable t) {
                Log.d(TAG, "[onError] ");
                t.printstacktrace();
            }

            @Override
            public void onNext(MyTest m) {
                Log.d(TAG, "[onNext] " + m.toString());
            }
        });
    }
}

解决方法:

将代码的最后一部分重写为:

service.getoneTestRx()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<MyTest>() {
        @Override
        public void onCompleted() {
            Log.d(TAG, "[onCompleted] ");
        }

        @Override
        public void one rror(Throwable t) {
            Log.d(TAG, "[onError] ");
            t.printstacktrace();
        }

        @Override
        public void onNext(MyTest m) {
            Log.d(TAG, "[onNext] " + m.toString());
        }
    });

来自@akarnokd的重要提示:

Worth mentioning that one needs to chain the calls as here because
Observable is not the builder pattern (where you modify the settings
of an existing object)

关于错误android.os.networkonmainthreadexception asynctask getResponseCode错误的英文的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android HttpClient:NetworkOnMainThreadException、android – NetworkOnMainThreadException with retrofit-beta2和rxjava、android – RxJava 2 / Retrofit 2 – NetworkOnMainThreadException、android – RxJava和Retrofit2:NetworkOnMainThreadException的相关信息,请在本站寻找。

本文标签: