Как правильно выполнить HttpPost на onPageFinished в Android

#java #php #android #http-post

#java #php #Android #http-post

Вопрос:

В моем приложении у меня есть WebView. Если это веб-представление загружается, я хочу выполнить a HttpPost для извлечения переменной из скрипта. Однако я продолжаю получать ошибки исключения, которые говорят мне, что мне нужно выполнить HttpPost in AsyncTask . Я не знаю, как это сделать, так как я еще достаточно хорош в разработке Android.

Это HttpPost то, что я написал:

 HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new;   
HttpPost("myscript.php");

    try {
       // Add your data
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
       nameValuePairs.add(new BasicNameValuePair("website", "google.com"));
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

       // Execute HTTP Post Request
       HttpResponse response = httpclient.execute(httppost);

       // writing response to log
       Log.d("Http Response:", response.toString());

     } catch (ClientProtocolException e) {
       // TODO Auto-generated catch block
     } catch (IOException e) {
       // TODO Auto-generated catch block
     }
 

Это мой onPageFinished метод:

 myWebView.setWebViewClient(new WebViewClient()
{

    @Override
    public void onPageFinished(WebView myWebView, String url)
    {

        myWebView.loadUrl("javascript:(function() { "  
        "var tetsttest = document.getElementById('menu-toggle'); tetsttest.style.display = 'none'; tetsttest.style.display = 'none'; tetsttest.style.display = 'none';"  
        "})()");

        // when a page has finished loading dismiss any progress dialog
        if (progressDialog != null amp;amp; progressDialog.isShowing())
        {
            progressDialog.dismiss();
        }
     }
}); 
 

И это файл php:

 <?php

        $website = $_POST['website'];

    $conn = mysql_connect("localhost", "username", "password") or die("err");
    $db = mysql_select_db('database') or die("err");

    $sql = "SELECT color FROM colors WHERE website='$website'";
    $result = mysql_query($sql) or die(mysql_error());
    $row = mysql_fetch_array($result);
    $color = $row['color'];

    print "$color";

?>
 

Ответ №1:

Ну, все сетевые операции в Android должны выполняться в отдельном потоке, а AsyncTask — это класс, который позволяет вам выполнять потоковую обработку элегантным образом (безболезненная потоковая обработка). Вот пример asynctask:

 public class SendRequestAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        //runs in ui thread 
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        //perform network operations here it is the background thread
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //runs in ui thread you can update the layout here
    }
}
 

В вашем методе onpageloading finished вы можете вызвать эту asynctask следующим образом:

 new SendRequestAsyncTask().execute();
 

Комментарии:

1. Спасибо, но как мне реализовать это в моем файле? Должен ли я добавить его как отдельный файл класса?

2. Вы можете использовать его как внутренний класс, скопировав весь код, который вы опубликовали выше HttpClient, в doInBackground. Выполнение этого даст вам доступ ко всем переменным класса внешнего класса. Я обычно делаю это innerclass по этой причине

3. Ваш код работает как шарм, но я делаю что-то не так в своем php-файле, поскольку он не может правильно прочитать то, что PHP отправляет обратно. (php отправляет 01, 02, 03, 04, 05 или 06)

4. Я получаю либо или в качестве ответа. Http Response:﹕ [ 06-27 14:27:06.628 6574: 6574 I/NSApplication ] org.apache.http.message.BasicHttpResponse@41d0bac8

5. HttpPost httppost = new; HttpPost(«myscript.php «); ваш URL-адрес, вероятно, неверен в этой строке