转换结果时出错 java.io.IOException:尝试读取已关闭的流。 Android

Error converting result java.io.IOException: Attempted read on closed stream. Android

快2天了,我还是想不通。

我正在尝试使用 PDO 从数据库中获取数据(我是菜鸟) 它在我的本地主机上工作,但是当我尝试使用实际服务器时,它不工作而且我不知道为什么其他文件工作得很好而且我使用了相同的代码,只需编辑一些值

这是 java 代码

public class Attendance extends Activity {

private ProgressDialog mProgressDialog;
Button btnSearch;
EditText searchField;
TextView tv2, tv3, tv4, tv5, statVal, loginVal, logoutVal, accVal;
String stat,login,logout,acc;
JSONParser jsonParser = new JSONParser();
String username;
SessionManager session;
ArrayList<HashMap<String, String>> contactsList;

//private static String url_search_attendance = "http://10.0.3.2/sunshine-ems/attendance_details.php";
private static String url_search_attendance = "http://www.sunshine-ems.balay-indang/mobile/attendance_details.php";
Button btnLogout;
final Calendar myCalendar = Calendar.getInstance();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.attend);
    session = new SessionManager(getApplicationContext());
    username = session.getUsername();
    //search editText
    searchField = (EditText) findViewById(R.id.editText1);  
    final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
            // TODO Auto-generated method stub
            myCalendar.set(Calendar.YEAR, year);
            myCalendar.set(Calendar.MONTH, monthOfYear);
            myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            updateLabel();
        }

    };
    searchField.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            new DatePickerDialog(Attendance.this, date, myCalendar
                    .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                    myCalendar.get(Calendar.DAY_OF_MONTH)).show();
        }
    });

    //Logout Button
    btnLogout = (Button) findViewById(R.id.btnLogout);;
    btnLogout.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            // Launching All products Activity
            session.logoutUser();
            Intent i = new Intent(getApplicationContext(), Login.class);
            startActivity(i);

        }
    });

    //Hide TextViews
    instanciateAndHideTextViews();

    // Search Button
    btnSearch = (Button) findViewById(R.id.btnSearch);      
    btnSearch.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            new getAttendanceDetails().execute();
            displayTextViews();
        }
    });


}

private void instanciateAndHideTextViews(){

            tv2 = (TextView) findViewById(R.id.textView2);
            tv3 = (TextView) findViewById(R.id.textView3);
            tv4 = (TextView) findViewById(R.id.textView4);
            tv5 = (TextView) findViewById(R.id.textView5);
            statVal = (TextView) findViewById(R.id.statVal);
            loginVal = (TextView) findViewById(R.id.loginVal);
            logoutVal = (TextView) findViewById(R.id.logoutVal);
            accVal = (TextView) findViewById(R.id.accVal);

            tv2.setVisibility(View.GONE);
            tv3.setVisibility(View.GONE);
            tv4.setVisibility(View.GONE);
            tv5.setVisibility(View.GONE);
            statVal.setVisibility(View.GONE);
            loginVal.setVisibility(View.GONE);
            logoutVal.setVisibility(View.GONE);
            accVal.setVisibility(View.GONE);
}

private void displayTextViews(){
    tv2.setVisibility(View.VISIBLE);
    tv3.setVisibility(View.VISIBLE);
    tv4.setVisibility(View.VISIBLE);
    tv5.setVisibility(View.VISIBLE);
    statVal.setVisibility(View.VISIBLE);
    loginVal.setVisibility(View.VISIBLE);
    logoutVal.setVisibility(View.VISIBLE);
    accVal.setVisibility(View.VISIBLE);
}

private void updateLabel() {

    String myFormat = "yyy-MM-dd"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

    searchField.setInputType(InputType.TYPE_NULL);
    searchField.requestFocus();
    searchField.setText(sdf.format(myCalendar.getTime()));
}

private class getAttendanceDetails extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = new ProgressDialog(Attendance.this);
        mProgressDialog.setTitle("Loading Attendance details");
        mProgressDialog.setMessage("loading....");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.show();
    }

    protected String doInBackground(String... params) {

                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params1 = new ArrayList<NameValuePair>();
                    params1.add(new BasicNameValuePair("username", username));
                    params1.add(new BasicNameValuePair("date", searchField.getText().toString().trim()));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(
                            url_search_attendance, "GET", params1);

                    // check your log for json response
                    Log.d("Details Attendance", json.toString());

                    // json success tag
                    success = json.getInt("success");
                    if (success == 1) {
                        // successfully received attendance details
                        JSONArray jsonobj = json.getJSONArray("attendance_data"); // JSON Array

                        // get first object from JSON Array
                        JSONObject a_details = jsonobj.getJSONObject(0);

                        // Setter
                        stat = a_details.optString("status");
                        login = a_details.optString("login_time");
                        logout = a_details.optString("logout_time");
                        acc = a_details.optString("accumulated_time");

                    }else{

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

        return null;
    }

    protected void onPostExecute(String jsonArray) {
        // dismiss the dialog once got all details
        mProgressDialog.dismiss();

        runOnUiThread(new Runnable() {
            public void run() {
                statVal.setText(stat);
                loginVal.setText(login);
                logoutVal.setText(logout);
                accVal.setText(acc);

            }
        });


    }
}

}

这是 php 代码

  <?php 
require("config.php");
if (isset($_GET['username'])) {

$query = "
SELECT * FROM attendance
 where username= :username && date= :date";

$query_params = array(':username' => $_GET['username'],
                      ':date' => $_GET['date']
    );

//execute query
try {
    $stmt = $db-> prepare($query);
    $result = $stmt -> execute($query_params);
} catch (PDOException $ex) {
    $response["success"] = 0;
    $response["message"] = "Database Error!";
    die(json_encode($response));
}  


// Finally, we can retrieve all of the found rows into an array using fetchAll 
$rows = $stmt -> fetchAll();

if ($rows) {
    $response["success"] = 1;
    $response["message"] = "Post Available!";

    $response["attendance_data"] = array();

    foreach($rows as $row) {

        $a_data = array();
        $a_data["login_time"] = $row["login_time"];
        $a_data["logout_time"] = $row["logout_time"];
        $a_data["accumulated_time"] = $row["accumulated_time"];         
        $a_data["status"] = $row["status"];           


        //update our repsonse JSON data
        array_push($response["attendance_data"], $a_data);
    }

    // echoing JSON response
    echo json_encode($response);

} else {
    $response["success"] = 0;
    $response["message"] = "You don't have appointment history.";
    die(json_encode($response));
}


}
?>

这是错误日志

02-04 10:17:06.986: E/Buffer Error(2920): Error converting result    java.io.IOException: Attempted read on closed stream.
02-04 10:17:06.986: W/System.err(2920): org.json.JSONException: No value for attendance_data
02-04 10:17:06.990: W/System.err(2920):     at org.json.JSONObject.get(JSONObject.java:354)
02-04 10:17:06.990: W/System.err(2920):     at org.json.JSONObject.getJSONArray(JSONObject.java:544)
02-04 10:17:06.990: W/System.err(2920):     at com.example.androidtablayout.Attendance$getAttendanceDetails.doInBackground(Attendance.java:180)
02-04 10:17:06.990: W/System.err(2920):     at com.example.androidtablayout.Attendance$getAttendanceDetails.doInBackground(Attendance.java:1)
02-04 10:17:06.990: W/System.err(2920):     at android.os.AsyncTask.call(AsyncTask.java:287)
02-04 10:17:06.990: W/System.err(2920):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-04 10:17:06.990: W/System.err(2920):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-04 10:17:06.994: W/System.err(2920):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-04 10:17:06.994: W/System.err(2920):     at java.lang.Thread.run(Thread.java:856)

同样,它在我的本地主机上运行,​​但在实际服务器上不起作用。我希望有一个人可以帮助我。太感谢了。我真的需要这个汤姆

您没有可供读取的流。

java.io.IOException: Attempted read on closed stream.

如果它在您的本地主机上运行,​​但在您的服务器上运行不正常,则可能是您的 url 或您访问服务器的权限有问题。您不是在使用开放流。因此,请检查您的 url 和您的权限。确保您正在访问您的数据库,您有正确的登录信息。

希望对您有所帮助。