Переменные HttpPost и ошибка PHP - PullRequest
0 голосов
/ 04 января 2012

.PHP файл успешно работает, создав соединение БД и вставив sql.Мой единственный вывод - это где-то в .java-активности ... и да, я установил РАЗРЕШЕНИЯ НА ИНТЕРНЕТ в пределах манифеста.

МОЯ ОШИБКА: 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 ]

2 голосов
/ 04 января 2012

Как уже упоминалось, Android больше не допускает сетевой активности в потоке пользовательского интерфейса.Даже если они это сделали, вы не должны этого делать, потому что в течение всей сетевой активности пользовательский интерфейс будет не отвечать на запросы, что приведет к ухудшению взаимодействия с пользователем.

Вам необходимо использовать 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 голос
/ 04 января 2012

Начиная с Android 3.0, если у вас есть какие-либо сетевые операции (например, подключение к вашему сайту) в основном потоке (он же GUI), приложение выдает NetworkOnMainThreadException. Попробуйте протестировать в эмуляторе под управлением 2.2, чтобы увидеть, работает ли он (и в вашем коде нет других ошибок). В противном случае, чтобы он работал на 3.x и 4.x, вам нужно взглянуть на threading в Android. Учебное пособие можно найти здесь

0 голосов
/ 04 января 2012

Вероятно, StrictMode включен в потоке пользовательского интерфейса.

Попытка:

ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);

Вышеуказанное не рекомендуется, хотя, я думаю, вам нужно использовать AsyncTask .

...