在Android中将GET请求传递给远程服务器

24 浏览
0 Comments

在Android中将GET请求传递给远程服务器

我正在尝试从Android应用程序向远程服务器发送POST请求。该请求应该将值插入数据库的一列中。服务器端的PHP代码如下:\n

 connect_error){
    die("连接失败: ".$conn->connect_error); 
}
else {
    echo "连接成功"; 
    $sql="insert into SMS_TABLE(content) values ($sms_content)"; 
    if ($conn->query($sql)===true){
        echo "成功插入新记录"; 
    }
    else {
        echo "错误:".$sql."".$conn->error; 
    }
}
?>

\n发送GET请求到远程服务器的方法如下:\n

public void insertSMS() throws IOException {
        viewbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    URL url = new URL("https://smssaver.000webhostapp.com/helloworld/insert_data.php?sms_content=100");
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.disconnect();
                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        });
    }

\n当我在浏览器中输入链接时,它可以正常工作。但是,当我在Android中调用它时,它不起作用。

0
0 Comments

问题原因:在Android应用中,执行网络请求时,如果在主线程上执行网络操作,会导致主线程被阻塞,从而导致应用崩溃。在给定的代码中,没有在单独的线程上执行网络请求,而是在主线程上执行,因此出现了NetworkOnMainThreadException异常。

解决方法:将网络请求放在单独的线程中执行,以避免阻塞主线程。可以使用AsyncTask或其他多线程技术来实现。

以下是修复问题的代码示例:

// 创建一个继承自AsyncTask的内部类
private class NetworkTask extends AsyncTask {
    @Override
    protected Void doInBackground(String... params) {
        try {
            URL url = new URL(params[0]);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            // 设置其他请求属性以提高效率
            urlConnection.setReadTimeout(1000);
            urlConnection.setConnectTimeout(1000);
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
            
            // 处理响应数据(可根据需要进行操作)
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
// 在需要执行网络请求的地方调用该AsyncTask
String requestUrl = "https://smssaver.000webhostapp.com/helloworld/insert_data.php?sms_content=100";
new NetworkTask().execute(requestUrl);

通过将网络请求放在AsyncTask的doInBackground方法中执行,可以确保网络请求在后台线程上执行,避免了在主线程上执行网络操作导致的异常。

0