Android AsyncTask发起HttpPost请求返回null,Postman请求正常
问题排查与修复方案
我来帮你梳理下导致respons返回null的核心问题,以及对应的修复方式:
1. 异步任务的执行时机错误
你在点击按钮后,调用logIn.execute()立刻就用Toast获取logIn.respons——但AsyncTask的doInBackground是在后台线程异步执行的,这时候后台请求还没完成,respons要么是初始的空字符串,要么还没被赋值,自然拿不到正确结果。
正确的做法是在onPostExecute中处理异步任务的结果,因为这个方法是在主线程执行的,且只有当后台任务完成后才会触发。
2. 响应内容的获取方式错误
你在日志里用EntityUtils.toString(response.getEntity())打印了正确的响应内容,但赋值给respons时却用了String.valueOf(response.getEntity())——这只会把HttpEntity对象的toString标识(不是实际响应内容)赋值给变量,如果response.getEntity()为空,还会直接得到字符串"null"。
必须用EntityUtils.toString()来提取响应的文本内容。
3. 静态变量的风险
你把respons定义为static,这会导致多个task实例共享这个变量,容易出现数据混乱,建议去掉静态修饰符,改用异步任务的返回值传递结果。
修改后的代码示例
优化后的Task类
public class LoginTask extends AsyncTask<Void, Void, String> { private MainActivity activity; public LoginTask(MainActivity activity){ this.activity = activity; } @Override protected String doInBackground(Void... voids) { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://recrutement.stb.com.tn:1010/PlateformeApi_Externe/api/"); List<NameValuePair> nameValuePairs = new ArrayList<>(3); nameValuePairs.add(new BasicNameValuePair("username", "sami")); nameValuePairs.add(new BasicNameValuePair("password", "stb")); nameValuePairs.add(new BasicNameValuePair("AuthMethod", "FormsAuthentication")); try { httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); Log.d("myapp", "works till here. 2"); HttpResponse response = httpclient.execute(httppost); String responseContent = EntityUtils.toString(response.getEntity()); Log.d("myapp", "response " + responseContent); return responseContent; } catch (UnsupportedEncodingException | ClientProtocolException | IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String responseContent) { super.onPostExecute(responseContent); // 在这里处理最终结果,比如显示Toast if(responseContent != null){ Toast.makeText(activity, "code="+responseContent, Toast.LENGTH_LONG).show(); } else { Toast.makeText(activity, "请求失败,请检查网络或接口", Toast.LENGTH_LONG).show(); } } }
修改后的MainActivity点击事件
bo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LoginTask logIn = new LoginTask(MainActivity.this); logIn.execute(); // 不要在这里直接获取结果,异步任务还未完成 } });
额外注意事项
- 网络权限:确保在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - HttpClient兼容性:如果你的项目
targetSdkVersion >=23,HttpClient已被官方移除,需要在build.gradle中添加依赖:
更推荐使用android { useLibrary 'org.apache.http.legacy' }HttpURLConnection或OkHttp这类现代网络库替代HttpClient。
内容的提问来源于stack exchange,提问作者Ouertani Saiid
相关产品推荐
相关产品推荐

