当我使用readLine ()
时,使用BufferedReader时会遇到问题,它返回空值。这是我的代码:
如何找到问题的根源?
BackgroundTask_GET.java
public class BackgroundTask_GET extends AsyncTask<Void, Void, Void> {
String duongdan = MainActivity.SERVER_NAME;
TextView tvResult;
String strName, strScore;
String str;
ProgressDialog pDialog;
Context context;
public String TAG = "GG";
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Sending...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
public BackgroundTask_GET(Context context, TextView tvResult, String
strName, String strScore) {
this.tvResult = tvResult;
this.strName = strName;
this.strScore = strScore;
this.context = context;
}
@Override
protected Void doInBackground(Void... voids) {
duongdan += "?name=" + this.strName + "&score=" + this.strScore;
try {
URL url = new URL(duongdan);
HttpURLConnection urlConnection = (HttpURLConnection)
url.openConnection();
BufferedReader bfr = new BufferedReader(new
InputStreamReader(url.openStream()));
String line = "";
StringBuffer sb = new StringBuffer();
Log.d(TAG, "bfr:" + urlConnection);
while ((line = bfr.readLine()) != null) {
sb.append(line);
Log.d(TAG, "append"+sb.append(line));
}
str = sb.toString();
urlConnection.disconnect();
Log.d(TAG, "doInBackground: " + str);
} catch (MalformedURLException e) {
e.printStackTrace();
Log.d(TAG, "exception " + e);
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "exception " + e);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (pDialog.isShowing()) {
pDialog.dismiss();
}
tvResult.setText(str);
Log.d("RESULT", "khanh" + str);
}
}
```MainActivity
public class MainActivity extends AppCompatActivity implements
View.OnClickListener {
public static final String SERVER_NAME =
"http://192.168.1.2/AndroidNetworking_server/student_GET.php";
private EditText edtName, edtScore;
private Button btnSend;
private TextView tvResult;
String strName, strScore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtName = findViewById(R.id.edtName);
edtScore = findViewById(R.id.edtScore);
btnSend = findViewById(R.id.btnSend);
tvResult = findViewById(R.id.tvResult);
btnSend.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.btnSend:
strName = edtName.getText().toString();
strScore = edtScore.getText().toString();
BackgroundTask_GET backgroundTask = new
BackgroundTask_GET(this, tvResult, strName, strScore);
backgroundTask.execute();
break;
}
}
}
错误: 〜
` 1 `
2019-07-15 14:07:58.065 24764- 28936 / com.example.lab2_khanhpd02377_androidnetworkingD / GG:bfr:com.android.okhttp.internal.huc.HttpURLConnectionImpl:http://192.168.1.2/AndroidNetworking_server/student_GET.php?name=4&score=5
〜
` 2 `
2019-07-15 14:07:58.066 24764- 28936 / com.example.lab2_khanhpd02377_androidnetworking D / GG:doInBackground:
答案 0 :(得分:2)
我可以看到您的代码有几个问题:
readLine()
方法返回删除了行分隔符 的行。所以
while ((line = bfr.readLine()) != null) {
sb.append(line);
}
在读取时会去除行分隔符。
您没有检查HTTP响应代码。如果响应代码不是2xx代码,则getInputStream()
将引发异常。
可以使用getResponseCode()
找到响应代码。可以使用getErrorStream()
读取错误响应正文。
正如@ user207421所说,除非您确实需要断开连接,否则不应该呼叫urlConnection.disconnect()
。如果不需要,最好让HTTP客户端库处理断开连接。 (它可能能够保持连接打开,并用于以后对同一服务器的请求。)
您应该 1 关闭BufferedReader
,理想情况下,您应该使用 try-with-resources
1-我不会说必须,因为在某些情况下这无关紧要。但是,如果不以一种或另一种方式关闭流,则将泄漏文件描述符,这可能会在以后导致错误。而且,关闭流当然是个好习惯……因为您永远不会真正在将来在资源泄漏确实很重要的情况下使用/重用您的代码。
更新-我想您是说null
/空流的真正真正原因是PHP。尽管如此,您可能应该解决我提到的四个问题:行分隔符,响应代码,断开连接和使用try-with-resource。