0

У меня есть этот код для отправки знака в запросе:Android Асинхронный HttpURLConnection запрос

@Override 
public void onClick(View arg0) { 

    switch(arg0.getId()) { 

     case R.id.signInButton: 
      new AsyncSignIn().execute(); 
      break; 

     default: 
      break; 
    } 
} 

private class AsyncSignIn extends AsyncTask<Void, Void, Void> { 

    protected Void doInBackground(Void...voids) { 
     try { 
      String email = eField.getText().toString(); 
      String password = pField.getText().toString(); 
      if(isOnline(getApplicationContext())) { 
       if(!Requester.signIn(email, password)) { 
        makeToast("Неверный логин или пароль."); 
       } 
       else { 
        _userEmail = email; 
        startMainContentActivity(); 
       } 
      } 
      else { 
       makeToast("Нет доступа к интернету."); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }   
     return null; 
    } 

} 

Но приложение аварии за исключением NetworkOnMainThread:

01-24 20:04:15.248: E/AndroidRuntime(758): android.os.NetworkOnMainThreadException 

На самом деле в этой строке, где «осилить» является объект HttpURLConnection:

DataOutputStream writer = new DataOutputStream(handle.getOutputStream()); 

Я уже пытался использовать Handler для этого, но ther e был тем же результатом. Что не так?

Update

Это функция, которая отправляет запрос после подписи в:

protected String sendPost(String _url, String _urlParameters) throws IOException { 
    URL url = new URL(_url); 
    HttpURLConnection handle = (HttpURLConnection) url.openConnection(); 
    handle.setRequestMethod("POST"); 
    handle.setRequestProperty("Host", Host); 
    handle.setRequestProperty("Content-Type", POSTContentType); 
    handle.setRequestProperty("Content-Length", ""+_urlParameters.getBytes().length); 
    handle.setRequestProperty("User-Agent", UserAgent); 
    handle.setRequestProperty("Accept", Accept); 
    handle.setRequestProperty("Accept-Language", AcceptLang); 
    handle.setRequestProperty("Connection", Connection); 
    handle.setUseCaches(false); 
    handle.setDoOutput(true); 
    handle.setDoInput(true); 

    DataOutputStream writer = new DataOutputStream(handle.getOutputStream()); //App crashed string 
    writer.writeBytes(_urlParameters); 
    writer.flush(); 
    writer.close(); 
    int responseCode = handle.getResponseCode(); 

    if(responseCode == 200) {  
     BufferedReader reader = new BufferedReader(new InputStreamReader(handle.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while((inputLine = reader.readLine()) != null) { 
      response.append(inputLine); 
     } 
     return response.toString(); 
    } 
    else { 
     return null; 
    } 
} 

Права доступа из манифеста:

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

зарегистрировались

В этом нет ничего интересного.

public boolean signIn(String _email, String _pass) throws IOException { 
    String link = signInURL; 
    String signInData = "email="+_email+"&password="+_pass; 
    String response = sendPost(link, signInData); 
    System.out.println(response); 
    if(response.compareTo("Logged") == 0) { 
     return true; 
    } 
    return false; 
} 

makeToast

То же самое с makeToast - ничего интересного.

protected void makeToast(String mess) { 
    Toast t = Toast.makeText(getApplicationContext(), mess, Toast.LENGTH_SHORT); 
    t.setGravity(Gravity.CENTER, 0, 0); 
    t.show(); 
} 
+0

вы дали это разрешение в файле манифеста. InnocentKiller

+0

Да, кроме того, есть еще одно разрешение

+0

Пожалуйста , опубликуйте фрагмент кода, к которому осуществляется доступ к сети – sthor69

ответ

2

Одна проблема с:

 String email = eField.getText().toString(); 
     String password = pField.getText().toString(); 

вы не должны получить доступ к UI из не потока пользовательского интерфейса, не уверен об использовании GetText - но всегда лучше, чтобы сделать это правило. Вы можете прочитать ваши поля в onPreExecute, а также показать Toast в onPostExecute вашей AsyncTask.

в противном случае ваш код выглядит хорошо, вы можете приложить полный stact след, а не только одну строку этого

2
--Check your doInBackground part i am 100% sure you show "Toast" in else part 
    else { 
      makeToast("Нет доступа к интернету."); <-- 
     } 

-You can't update UI stuff in doInBackground(). Hence, you can't display a Toast there. You 
needto move this to onPostExecute() or somewhere else. Possibly onProgressUpdate() 
Смежные вопросы