Android HttpUrlConnection在移动设备上不起作用,但在emulator上起作用
突然,我的移动设备无法再连接到本地服务器。异步任务没有执行,我就是不明白为什么。慢慢地,我变得非常绝望,因为在我看来,我没有改变任何事情来引起这一切。 例如,这是一个不起作用的后台任务Android HttpUrlConnection在移动设备上不起作用,但在emulator上起作用,android,android-asynctask,httprequest,Android,Android Asynctask,Httprequest,突然,我的移动设备无法再连接到本地服务器。异步任务没有执行,我就是不明白为什么。慢慢地,我变得非常绝望,因为在我看来,我没有改变任何事情来引起这一切。 例如,这是一个不起作用的后台任务 public class Login extends AsyncTask<String, Void, String>{ private String loginUrl = "http://..."; private int loginSuccess = 0; public
public class Login extends AsyncTask<String, Void, String>{
private String loginUrl = "http://...";
private int loginSuccess = 0;
public String getToken(String fromJson) throws JSONException {
JSONObject json = new JSONObject(fromJson);
if(json.has("api_authtoken")) {
loginSuccess = 1;
String appToken = json.getString("api_authtoken");
return appToken;
}
else {
return json.toString();
}
}
public String doInBackground(String... arg0) {
// so that they can be closed in the finally block.
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String authToken;
try {
// get logged in to get the api_authtoken
String email = (String) arg0[0];
String password = (String) arg0[1];
URL url = new URL(loginUrl);
// Create the request and open the connection
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Accept", "application/json");
//put values of edittexts into json-Object
JSONObject data = new JSONObject();
try {
data.put("email", email);
data.put("password", password);
} catch(JSONException e) {
Log.e("EXCEPTION", "unexpected JSON exception", e);
e.printStackTrace();
}
urlConnection.connect();
OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
wr.write(data.toString());
wr.flush();
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
//read server response
while((line = reader.readLine()) != null) {
sb.append(line);
}
//receive server "answer"
try {
return getToken(sb.toString());
}catch(JSONException e) {
Log.e("LOG", "unexpected JSON exception", e);
e.printStackTrace();
} finally{
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("MainActivity", "Error closing stream", e);
}
}
}
//return sb.toString();
return null;
}
catch(IOException e) {
Log.e("LoginTask", "Error ", e);
// If the code didn't successfully get the data, there's no point in attempting
// to parse it.
//forecastJsonStr = null;
return null;
}
}
public void onPostExecute(String result) {
super.onPostExecute(result);
//Log.v("RESULT", result);
if(result == null) {
CharSequence text = "no internet connection";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, text, duration);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
if(loginSuccess == 0) {
// if the request wasn't successful
// give user a message via toast
CharSequence text = "wrong password or user. please try again";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, text, duration);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
else {
// save token in shared preferences
SharedPreferences tokenPref = getSharedPreferences(getString(R.string.preference_token), Context.MODE_PRIVATE);
SharedPreferences.Editor editorToken = tokenPref.edit();
editorToken.putString(getString(R.string.saved_auth_token), result);
editorToken.commit();
//save login status = 1 in shared preferences
SharedPreferences loginPref = getSharedPreferences(getString(R.string.preference_logged_in), Context.MODE_PRIVATE);
SharedPreferences.Editor editorLogin = loginPref.edit();
editorLogin.putString(getString(R.string.saved_login), "1");
editorLogin.commit();
Intent mapsIntent = new Intent(getApplicationContext(), MapsActivity.class);
startActivity(mapsIntent);
}
}
}
公共类登录扩展异步任务{
专用字符串loginUrl=”http://...";
private int loginsucess=0;
公共字符串getToken(String fromJson)抛出JSONException{
JSONObject json=新的JSONObject(fromJson);
if(json.has(“api_authtoken”)){
登录成功率=1;
String appToken=json.getString(“api_authtoken”);
返回appToken;
}
否则{
返回json.toString();
}
}
公共字符串doInBackground(字符串…arg0){
//这样就可以在finally块中关闭它们。
HttpURLConnection-urlConnection=null;
BufferedReader reader=null;
字符串authToken;
试一试{
//登录以获取api_authtoken
字符串email=(字符串)arg0[0];
字符串密码=(字符串)arg0[1];
URL=新URL(loginUrl);
//创建请求并打开连接
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“POST”);
setRequestProperty(“内容类型”、“应用程序/json”);
setRequestProperty(“接受”、“应用程序/json”);
//将EditText的值放入json对象
JSONObject数据=新的JSONObject();
试一试{
数据。放入(“电子邮件”,电子邮件);
数据输入(“密码”,密码);
}捕获(JSONException e){
Log.e(“异常”,“意外JSON异常”,e);
e、 printStackTrace();
}
urlConnection.connect();
OutputStreamWriter wr=新的OutputStreamWriter(urlConnection.getOutputStream());
write(data.toString());
wr.flush();
reader=new BufferedReader(新的InputStreamReader(urlConnection.getInputStream());
StringBuilder sb=新的StringBuilder();
字符串行=null;
//读取服务器响应
而((line=reader.readLine())!=null){
某人附加(行);
}
//接收服务器“应答”
试一试{
返回getToken(sb.toString());
}捕获(JSONException e){
Log.e(“Log”,“意外JSON异常”,e);
e、 printStackTrace();
}最后{
if(urlConnection!=null){
urlConnection.disconnect();
}
if(读卡器!=null){
试一试{
reader.close();
}捕获(最终IOE例外){
Log.e(“MainActivity”,“错误关闭流”,e);
}
}
}
//使某人返回字符串();
返回null;
}
捕获(IOE异常){
Log.e(“登录任务”,“错误”,e);
//如果代码没有成功获取数据,那么尝试就没有意义了
//来解析它。
//forecastJsonStr=null;
返回null;
}
}
public void onPostExecute(字符串结果){
super.onPostExecute(结果);
//Log.v(“结果”,结果);
如果(结果==null){
CharSequence text=“无互联网连接”;
int duration=Toast.LENGTH\u LONG;
Toast Toast=Toast.makeText(MainActivity.this,text,duration);
toast.setGravity(重心垂直,0,0);
toast.show();
}
如果(登录成功==0){
//如果请求不成功
//通过toast向用户发送消息
CharSequence text=“密码或用户错误,请重试”;
int duration=Toast.LENGTH\u LONG;
Toast Toast=Toast.makeText(MainActivity.this,text,duration);
toast.setGravity(重心垂直,0,0);
toast.show();
}
否则{
//在共享首选项中保存令牌
SharedReferences-tokenPref=GetSharedReferences(getString(R.string.preference\u-token),Context.MODE\u-PRIVATE);
SharedReferences.Editor editorToken=tokenPref.edit();
editorToken.putString(getString(R.string.saved_auth_token),result);
editorToken.commit();
//在共享首选项中保存登录状态=1
SharedReferences loginPref=getSharedReferences(getString(R.string.preference\u logged\u in)、Context.MODE\u PRIVATE);
SharedReferences.Editor editorLogin=loginPref.edit();
editorLogin.putString(getString(R.string.saved_login),“1”);
editorLogin.commit();
Intent mapsIntent=新的Intent(getApplicationContext(),MapsActivity.class);
星触觉(MAPSINT);
}
}
}
sdk 23不再支持HttpClient
。您必须使用URLConnection或降级到sdk 22(编译'com.android.support:appcompat-v7:22.2.0')
如果您需要sdk 23,请将其添加到gradle中:
android {
useLibrary 'org.apache.http.legacy'
}
HttpClient
在sdk 23中不再受支持。您必须使用URLConnection或降级到sdk 22(编译'com.android.support:appcompat-v7:22.2.0')
如果您需要sdk 23,请将其添加到gradle中:
android {
useLibrary 'org.apache.http.legacy'
}
您应该考虑使用HTTP库,internet上有很多HTTP库,其中一些非常易于使用、优化且无错误
例如,截击(由谷歌制作,I
public class Login extends AsyncTask<String, Void, String>{
private String loginUrl = "http://...";
private int loginSuccess = 0;
public String getToken(String fromJson) throws JSONException {
JSONObject json = new JSONObject(fromJson);
if(json.has("api_authtoken")) {
loginSuccess = 1;
String appToken = json.getString("api_authtoken");
return appToken;
}
else {
return json.toString();
}
}
public String doInBackground(String... arg0) {
// so that they can be closed in the finally block.
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String authToken;
try {
// get logged in to get the api_authtoken
String email = (String) arg0[0];
String password = (String) arg0[1];
URL url = new URL(loginUrl);
// Create the request and open the connection
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Accept", "application/json");
urlConnection.setDoOutput(true); // HERE
//put values of edittexts into json-Object
JSONObject data = new JSONObject();
try {
data.put("email", email);
data.put("password", password);
} catch(JSONException e) {
Log.e("EXCEPTION", "unexpected JSON exception", e);
e.printStackTrace();
}
OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
wr.write(data.toString());
wr.flush();
urlConnection.connect();
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
//read server response
while((line = reader.readLine()) != null) {
sb.append(line);
}
//receive server "answer"
try {
return getToken(sb.toString());
}catch(JSONException e) {
Log.e("LOG", "unexpected JSON exception", e);
e.printStackTrace();
} finally{
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("MainActivity", "Error closing stream", e);
}
}
}
//return sb.toString();
return null;
}
catch(IOException e) {
Log.e("LoginTask", "Error ", e);
// If the code didn't successfully get the data, there's no point in attempting
// to parse it.
//forecastJsonStr = null;
return null;
}
}
public void onPostExecute(String result) {
super.onPostExecute(result);
//Log.v("RESULT", result);
if(result == null) {
CharSequence text = "no internet connection";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, text, duration);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
if(loginSuccess == 0) {
// if the request wasn't successful
// give user a message via toast
CharSequence text = "wrong password or user. please try again";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, text, duration);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
else {
// save token in shared preferences
SharedPreferences tokenPref = getSharedPreferences(getString(R.string.preference_token), Context.MODE_PRIVATE);
SharedPreferences.Editor editorToken = tokenPref.edit();
editorToken.putString(getString(R.string.saved_auth_token), result);
editorToken.commit();
//save login status = 1 in shared preferences
SharedPreferences loginPref = getSharedPreferences(getString(R.string.preference_logged_in), Context.MODE_PRIVATE);
SharedPreferences.Editor editorLogin = loginPref.edit();
editorLogin.putString(getString(R.string.saved_login), "1");
editorLogin.commit();
Intent mapsIntent = new Intent(getApplicationContext(), MapsActivity.class);
startActivity(mapsIntent);
}
}
}