2013-04-03 2 views
-2

У меня проблема с моим клиентом 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);   
} 

}

+0

Поместите свой метод Auth в AsyncTask doInBackground(). Вы можете использовать класс asyncTask как внутренний класс своей деятельности. – Hasham

ответ

1

Попробуйте это:

public class RestLogin extends AsyncTask<String, Void, Boolean> { 

private static String URL = "http://Restful webservice here?"; 
private static final String tag = "Logcat tag: "; 

    @Override 
    protected Boolean doInBackground(String... params) { 

     String username = params[0]; //username 
     String password = params[1]; //password 

     //now call Auth 
     return Auth(username,password); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 

     super.onPostExecute(result); 

     if(result){ 

      //successful login. Display a Toast or take the user to next screen by using intent. 
     } 
     else { 

      //Display Authentication failed error message. 

     } 
    } 

    public Boolean Auth(String username,String password) 
    { 

     // your logic. 

    } 

} 

AsyncTask может быть вызвана следующим кодом.

new RestLogin().execute(username,password); 

Позвольте мне знать, если вам нужна дополнительная помощь.

+0

Пройдите несколько примеров о AsyncTask для лучшего понимания , – SKK

+0

спасибо за ваш ответ. где я размещаю синтаксис: new RestLogin(). execute (имя пользователя, пароль); ? активность в другом файле? – randytan

+0

в вашем классе активности. у вас может быть кнопка «Войти»? напишите, что в Login.setOnClickListener() { – SKK

0

NetworkOnmainthreadException происходит потому, что ваш работают связанные сетевой операции на главном UI Thread. Для этого вы должны использовать Asynctask.

Исключение, возникающее при попытке приложения выполнить сетевую операцию в своем основном потоке.

Это только для приложений, предназначенных для SDK Honeycomb или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено создавать сети по своим основным потокам цикла событий, но это сильно обескураживает. См. Документ «Разработка для реагирования».

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

Вы можете использовать asycntask. http://developer.android.com/reference/android/os/AsyncTask.html

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
      new TheTask(username,password).execute(); 
     } 
class TheTask extends AsyncTask<Void,Void,Void> 
{ 
    String username,pwd; 
    public TheTask(String uname, String password) 
    { 
    username=uname; 
    pwd=password;  
    } 
    protected void onPreExecute() 
    {   super.onPreExecute(); 
      //display progressdialog. 
    } 

    protected void doInBackground(Void ...params) 
    { 
     //rest web service. do not update ui here 
     boolean somevalue= Auth(username, pwd); 
     return null; 
    } 

    protected void onPostExecute(Void result) 
    {  
      super.onPostExecute(result); 
      //dismiss progressdialog. 
      //update ui 
    } 

} 
+0

да, я просто добавляю Asynctask, но теперь я застреваю, так как метод Auth() используется другим файлом. как я могу комбинировать asynctask и метод Auth()? – randytan

+0

Я не понимаю полный сценарий. Вы хотите получить доступ к данным, возвращаемым веб-службой отдыха в другом действии. – Raghunandan

+0

вот логика, у меня 2 разных класса. Сначала класс входа, в который я помещаю всю активность. Во-вторых, класс LoginRest, который является классом, который шлюз между клиентом и веб-сервисом.Класс LoginRest показан выше, этот класс отвечает за потребление и аутентификацию пользователя – randytan

Смежные вопросы