关于错误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 HttpClient:NetworkOnMainThreadException
- android – NetworkOnMainThreadException with retrofit-beta2和rxjava
- android – RxJava 2 / Retrofit 2 – NetworkOnMainThreadException
- android – RxJava和Retrofit2:NetworkOnMainThreadException
错误android.os.networkonmainthreadexception asynctask getResponseCode(错误的英文)
当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!"); }
解决方法
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
我在下面有一些代码:
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
我最近从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
这就是我试图这样做的方式,此刻我可以刷新令牌,但它会抛出一个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(…)表示结果在指定的线程上发出 – 在这种情况下是UI线程.
subscribeOn(…)调用基本上是处理请求的地方.如果省略,则在当前线程上完成计算.
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的相关信息,请在本站寻找。
本文标签: