具有bufferedreader.readLine()的缓冲区意外返回null

时间:2019-07-15 07:08:39

标签: java android

当我使用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:

1 个答案:

答案 0 :(得分:2)

我可以看到您的代码有几个问题:

  1. readLine()方法返回删除了行分隔符 的行。所以

    while ((line = bfr.readLine()) != null) {
        sb.append(line);
    }
    

    在读取时会去除行分隔符。

  2. 您没有检查HTTP响应代码。如果响应代码不是2xx代码,则getInputStream()将引发异常。

    可以使用getResponseCode()找到响应代码。可以使用getErrorStream()读取错误响应正文。

  3. 正如@ user207421所说,除非您确实需要断开连接,否则不应该呼叫urlConnection.disconnect()。如果不需要,最好让HTTP客户端库处理断开连接。 (它可能能够保持连接打开,并用于以后对同一服务器的请求。)

  4. 应该 1 关闭BufferedReader,理想情况下,您应该使用 try-with-resources


1-我不会说必须,因为在某些情况下这无关紧要。但是,如果不以一种或另一种方式关闭流,则将泄漏文件描述符,这可能会在以后导致错误。而且,关闭流当然是个好习惯……因为您永远不会真正在将来在资源泄漏确实很重要的情况下使用/重用您的代码。


更新-我想您是说null /空流的真正真正原因是PHP。尽管如此,您可能应该解决我提到的四个问题:行分隔符,响应代码,断开连接和使用try-with-resource。