У меня проблема с моим клиентом android.Ошибка NetworkOnMainThreadException Потребление Restful Webservice с помощью Android Client 4.0
У меня есть сценарий, который потребляем успокоительной веб-сервиса и определения подлинности пользователя, вот мой код
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.AsyncTask;
import android.util.Log;
public class RestLogin {
private static String URL = "http://REST Webservice here?";
private static final String tag = "Logcat tag: ";
public static Boolean Auth(String username,String password)
{
String result = "";
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
//adding parameter to request to determine user authentication
request.addHeader("username",username);
request.addHeader("password",password);
//taking handler to get execution status
ResponseHandler<String> handler = new BasicResponseHandler();
try
{
result = httpclient.execute(request, handler);
}
catch (ClientProtocolException cpe)
{
cpe.printStackTrace();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
catch(IllegalArgumentException iae)
{
iae.printStackTrace();
}
catch(NullPointerException npe)
{
npe.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
Log.i(tag,result);
return Boolean.parseBoolean(result);
}
}
Во-первых, когда я построить код, он показывает NetworkOnMainThreadException ошибки на моем статусе LogCat. Тогда, я нахожу, что, поскольку сотовые телефоны google android, я не могу напрямую использовать этот метод. Поэтому мне нужно, чтобы добавить AsyncTask <>, вот код
public class RestLogin extends AsyncTask<String, String, Boolean> {
private static String URL = "http://Restful webservice here?";
private static final String tag = "Logcat tag: ";
@Override
protected Boolean doInBackground(String... params) {
//TO DO Auto Generated Method
return null;
}
теперь я застрял, как я могу вызвать метод Auth() с помощью AsyncTask?
благодарит заранее.
нормально, UPDATE: это новый синтаксис
public class RestLogin extends AsyncTask<Void, Void, Void> {
private static String URL = "http://REST Webservice here?";
private static final String tag = "Logcat tag: ";
private String usname, psswrd;
public RestLogin(String username, String password){
usname = username;
psswrd = password;
}
protected void onPreExecute(){
super.onPreExecute();
}
protected Void doInBackground(Void... params) {
Boolean stat = Auth(usname,psswrd);
return null;
}
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
}
public static Boolean Auth(String username,String password)
{
String result = "";
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
//adding parameter to request to determine user authentication
request.addHeader("username",username);
request.addHeader("password",password);
//taking handler to get execution status
ResponseHandler<String> handler = new BasicResponseHandler();
try
{
result = httpclient.execute(request, handler);
}
catch (ClientProtocolException cpe)
{
cpe.printStackTrace();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
catch(IllegalArgumentException iae)
{
iae.printStackTrace();
}
catch(NullPointerException npe)
{
npe.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
Log.i(tag,result);
return Boolean.parseBoolean(result);
}
}
Поместите свой метод Auth в AsyncTask doInBackground(). Вы можете использовать класс asyncTask как внутренний класс своей деятельности. – Hasham