在Android中将GET请求传递给远程服务器
在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中调用它时,它不起作用。
问题原因:在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方法中执行,可以确保网络请求在后台线程上执行,避免了在主线程上执行网络操作导致的异常。