I have a simple activity that sends an email and a password to a server and the server returns the next JSON
:
{
"token": "mytoken"
}
I'm doing the request on a different thread (AsyncTask
), but my code is throwing the next exception:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
at org.apache.http.impl.io.SocketInputBuffer.isDataAvailable(SocketInputBuffer.java:80)
at org.apache.http.impl.io.IdentityInputStream.available(IdentityInputStream.java:63)
at org.apache.http.conn.EofSensorInputStream.available(EofSensorInputStream.java:196)
at java.io.InputStreamReader.read(InputStreamReader.java:223)
at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1300)
at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1346)
at com.google.gson.stream.JsonReader.consumeNonExecutePrefix(JsonReader.java:1582)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:538)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.Gson.fromJson(Gson.java:806)
at com.google.gson.Gson.fromJson(Gson.java:748)
at com.myapp.evalatuclase.evaluacion.LoginActivity$LoginOperation.onPostExecute(LoginActivity.java:67)
at com.myapp.evalatuclase.evaluacion.LoginActivity$LoginOperation.onPostExecute(LoginActivity.java:47)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Here is my code:
LoginActivity.java
package com.myapp.evalatuclase.evaluacion;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.google.gson.Gson;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button login = (Button) findViewById(R.id.ingresar);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
EditText email = (EditText) findViewById(R.id.matriculaOemail);
EditText password = (EditText) findViewById(R.id.password);
params.add(new BasicNameValuePair("email",email.getText().toString()));
params.add(new BasicNameValuePair("password",password.getText().toString()));
new LoginOperation().execute(params);
}
});
}
private class LoginOperation extends AsyncTask<List<NameValuePair>,Void,Reader>{
@Override
protected Reader doInBackground(List<NameValuePair>... params){
try{
HttpBasicRequestService http = new HttpBasicRequestService();
Reader reader = new InputStreamReader(http.makePost("/auth/login/", "",params[0]));
return reader;
}catch (Exception ex){
Log.d("EVALUA_TU_CLASE", "Error "+ ex.toString());
}
return null;
}
@Override
protected void onPostExecute(Reader reader) {
super.onPostExecute(reader);
Gson gson = new Gson();
Log.d("EVALUA_TU_CLASE", "Creando json");
LoginJSON token = gson.fromJson(reader,LoginJSON.class); // In this line is where the exception is throwed :C
Log.d("EVALUA_TU_CLASE", "JSON");
Log.d("EVALUA_TU_CLASE", token.token);
//getSharedPreferences("EVALUA_TU_PROFESOR", Context.MODE_PRIVATE);
}
}
}
HttpBasicRequestService.java
package com.myapp.evalatuclase.evaluacion;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class HttpBasicRequestService {
public InputStream makeGet(String url, String tokenUser) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getRequest = new HttpGet(Constants.URL_WEB_SERVICE.concat(url));
getRequest.addHeader("Authorization", "JWT ".concat(tokenUser));
try {
HttpResponse getResponse = client.execute(getRequest);
final int statusCode = getResponse.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w(getClass().getSimpleName(),
"Error " + statusCode + " for URL " + url);
return null;
}
HttpEntity getResponseEntity = getResponse.getEntity();
return getResponseEntity.getContent();
}
catch (IOException e) {
getRequest.abort();
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
}
return null;
}
public InputStream makePost(String url,String tokenUser, List<NameValuePair> params ){
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(Constants.URL_WEB_SERVICE.concat(url));
post.addHeader("Authorization", "JWT ".concat(tokenUser));
try{
post.setEntity(new UrlEncodedFormEntity(params));
}catch (UnsupportedEncodingException e){
Log.e("EVALUA_TU_CLASE", e.toString());
}
try {
HttpResponse getResponse = client.execute(post);
final int statusCode = getResponse.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w(getClass().getSimpleName(),
"Error " + statusCode + " for URL " + url);
return null;
}
HttpEntity getResponseEntity = getResponse.getEntity();
return getResponseEntity.getContent();
}
catch (IOException e) {
post.abort();
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
}
return null;
}
}
LoginJSON.java
package com.myapp.evalatuclase.evaluacion;
public class LoginJSON {
public String token;
}
Any help would be appreciated!
Thanks in advance!