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来做这件事, e是同样的结果。怎么了?

更新

这是发送POST请求登录的函数:从清单

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访问UI - 但它始终是更好地成为一个惯例。您可以在onExExcute中读取字段,也可以在AsyncTask的onPostExecute中显示Toast。

,否则你的代码看起来不错,你可能会附上全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()