HttpPost变量和PHP错误

时间:2012-01-04 02:44:42

标签: php android httpresponse http-get

.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文件进行数小时的故障排除后,我弃牌。 有什么特别突出的吗? 感谢。

3 个答案:

答案 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