#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-адрес, вероятно, неверен в этой строке