.PHP文件通过创建数据库连接并插入sql成功运行。 我唯一的结论是它在.java活动中的某个地方 ..是的,我已经在清单中设置了INTERNET PERMISSIONS。
MY ERROR:01-03 21:56:05.784:W / System.err(1398):android.os.NetworkOnMainThreadException
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//setContentView(R.layout.email);
try {
postInternetData();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void postInternetData() {
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://www.example.com/app/insert_tag.php");
try{
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("name", "android"));
post.setEntity(new UrlEncodedFormEntity (formparams));
HttpResponse response = httpclient.execute(post);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
<?php
// CREATE the connection
$connection = mysql_connect('XXXXXXXXXXX.db.godaddy.com','XXXXXXXXXXX','XXXXXXXXXXX');
if(!$connection) {
echo 'failure to connect host';
}
$mysql_select_db = mysql_select_db('XXXXXXXXXXX', $connection);
if(!$mysql_select_db) {
echo 'failure to select db';
}
$name = $_POST['name'];
$qry = "INSERT INTO httptest(id, name) VALUES ('', '" . $name . "');";
$result = mysql_query($qry, $connection);
IF (!$result){
echo 'failure to query db';
} else {
echo $result;
}
?>
通过stackoverflow示例和man文件进行数小时的故障排除后,我弃牌。 有什么特别突出的吗? 感谢。
答案 0 :(得分:2)
与其他人提到的一样,Android不再允许UI线程上的任何网络活动。即使他们这样做了,也不能这样做,因为在网络活动期间,用户界面将无法响应,导致用户体验不佳。
您需要使用的是ASyncTask
您可以拨打ASyncTask
new MyAsyncTask().execute();
这就是你设置它的方式
private final class MyAsyncTask extends AsyncTask<Void,Void,Void>
{
private ProgressDialog progressdialog;
protected String doInBackground(Void... params)
{
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet("http://example.com/getinfo"));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK)
{
//successful response
}
else
{
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
}
catch(Exception e)
{
ProgressDialog.show(HelloWorldActivity.this,"","Failed",true);
}
}
protected void onPostExecute(String result)
{
if (progressdialog.isShowing())
progressdialog.dismiss();
Toast.makeText(HelloWorldActivity.this,"Completed",Toast.LENGTH_SHORT).show();
}
protected void onPreExecute()
{
progressdialog = ProgressDialog.show(HelloWorldActivity.this,"","Working...",true);
}
}
答案 1 :(得分:1)
从Android 3.0开始,如果您在主(也称为GUI)线程上有任何网络操作(例如,连接到您的站点),则应用程序将抛出NetworkOnMainThreadException
。尝试在运行2.2的模拟器中进行测试以查看它是否有效(并且代码中没有其他错误)。否则,要使其在3.x和4.x上运行,您需要在Android中查看threading。可以找到一个教程here
答案 2 :(得分:0)
可能在UI线程上启用了StrictMode。
尝试:
ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);
以上不建议使用,我认为您需要使用AsyncTask。