Этот код предназначен для передачи значений на страницу php и обновления строки в базе данных.
Мне нужен следующий код, чтобы перейти в asynctask, и как я могу вызвать его потом и т. Д. Я получаю ошибку android.os.networkonmainthreadexception.
public void dbUpdate(ArrayList<NameValuePair> data, String php)
{
InputStream iS = null;
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(php);
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
iS = entity.getContent();
}
catch(Exception e)
{
Log.e("log_tag", "Error in http connection " + e.toString());
Toast.makeText(getBaseContext(), "Error " + e.toString(), Toast.LENGTH_LONG).show();
}
}
это код внутри моей кнопки на данный момент
public void Update(View v)
{
try
{
String nM = this.Name.getText().toString();
String tP = this.Type.getText().toString();
String bR = this.Breed.getText().toString();
String gE = this.Gender.getText().toString();
String iN = this.Injuries.getText().toString();
String tR = this.Treat.getText().toString();
ArrayList<NameValuePair> up = new ArrayList<NameValuePair>();
up.add(new BasicNameValuePair("name", nM));
up.add(new BasicNameValuePair("type", tP));
up.add(new BasicNameValuePair("breed", bR));
up.add(new BasicNameValuePair("gender", gE));
up.add(new BasicNameValuePair("injuries", iN));
up.add(new BasicNameValuePair("treatment", tR));
String php = "http://select.garethprice.co.za/update.php?nM=" + nM;
dbUpdate(up, php);
Toast.makeText(getBaseContext(), "Successfully updated", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
Log.e("log_tag", "Error in uploading " + e.toString());
Toast.makeText(getBaseContext(), "Error " + e.toString(), Toast.LENGTH_LONG).show();
}
}
Заранее спасибо!
Как это. Это очень простая реализация, но она охватывает вашу ситуацию.
private class YourAsyncTask extends AsyncTask<Void, Void, Boolean>
{
@Override
protected Void doInBackground(Void... arg0)
{
try
{
String nM = this.Name.getText().toString();
String tP = this.Type.getText().toString();
String bR = this.Breed.getText().toString();
String gE = this.Gender.getText().toString();
String iN = this.Injuries.getText().toString();
String tR = this.Treat.getText().toString();
ArrayList<NameValuePair> up = new ArrayList<NameValuePair>();
up.add(new BasicNameValuePair("name", nM)); up.add(new BasicNameValuePair("type", tP));
up.add(new BasicNameValuePair("breed", bR));
up.add(new BasicNameValuePair("gender", gE)); up.add(new BasicNameValuePair("injuries", iN));
up.add(new BasicNameValuePair("treatment", tR));
String php = "http://select.garethprice.co.za/update.php?nM=" + nM; dbUpdate(up, php);
dbUpdate(up, php);
}
catch(Exception e)
{
Log.e("log_tag", "Error in uploading " + e.toString());
Toast.makeText(getBaseContext(), "Error " + e.toString(), Toast.LENGTH_LONG).show();
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result)
{
if (result)
{
Toast.makeText(getBaseContext(), "Successfully updated", Toast.LENGTH_LONG).show();
}
}
}
Вот хороший учебник по AsyncTask. Вызовы, которые требуют подключения к серверной части и извлечения данных, как этот
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(php);
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
iS = entity.getContent();
можно положить в doInBackground()
в то время как обработка результата может быть сделана в PostExeceute()
метод.
Асинхронная задача — это класс, который можно вызывать внутри другого для выполнения HTTP-запросов в фоновом потоке. Ваш класс AsyncTask будет называться dbUpdate. Если вы хотите, чтобы действия в AsyncTask выполнялись, добавьте следующую строку в соответствующий метод или прослушиватель.
new dbUpdate().execute();
Это будет во внешнем классе, и теперь нам нужно настроить класс AsyncTask для отправки HTTP-запроса. Создать public class dbUpdate extends AsyncTask<String, String, String, String, String, String>
, Теперь у этого класса будет три метода.
@Override
public void onPreExecute() { super.onPreExecute(); }
protected String doInBackground(String... args) { /* more code here */ }
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if(result) Toast.makeText(getBaseContext(), "Successfully updated", Toast.LENGTH_LONG).show();
}
Теперь, если вы хотите, чтобы какой-либо код выполнялся до или после запроса, включите их после супер вызова в onPreExecute или же onPostExecute. в doInBackground будет вашим HTTP-запросом (следующий код). Вы можете создать все глобальные переменные Strings, чтобы их можно было изменять в обоих классах.
String nM = this.Name.getText().toString();
String tP = this.Type.getText().toString();
String bR = this.Breed.getText().toString();
String gE = this.Gender.getText().toString();
String iN = this.Injuries.getText().toString();
String tR = this.Treat.getText().toString();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://select.garethprice.co.za/update.php?nM=" + nM);
try{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", nM));
params.add(new BasicNameValuePair("type", tP));
params.add(new BasicNameValuePair("breed", bR));
params.add(new BasicNameValuePair("genders", gE));
params.add(new BasicNameValuePair("issues", iN));
params.add(new BasicNameValuePair("treatment", tR));
httppost.setEntity(new UrlEncodedFormEntity(params));
httpclient.execute(httppost);
} catch (Exception e) {
Log.e("log_tag", "Error in uploading " + e.toString());
Toast.makeText(getBaseContext(), "Error " + e.toString(), Toast.LENGTH_LONG).show();
}
return null;
Это будет что-то вроде следующего:
public class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
protected void onPreExecute() {
}
protected Boolean doInBackground(Void param) {
InputStream iS = null;
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(php);
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
iS = entity.getContent();
}
catch(Exception e)
{
Log.e("log_tag", "Error in http connection " + e.toString());
return false;
}
return true;
}
protected void onPostExecute(Boolean result) {
if(result)
Toast.makeText(getBaseContext(), "Successfully updated", Toast.LENGTH_LONG).show();
else
Toast.makeText(getBaseContext(), "Error " + e.toString(), Toast.LENGTH_LONG).show();
}
onPreExecute
а также onPostExecute
будет вызван в потоке пользовательского интерфейса. Это означает, что можно создавать диалоги, тосты и т. Д.
doInBackground
будет работать в новом рабочем потоке. Это запустит ваш сетевой код. doInBackground
возвращает логическое значение для onPostExecute
чтобы указать, нужно ли показывать тост или нет.
Затем вы запускаете его на своей кнопке так: new MyAsyncTask().execute();
заменив этот вызов: dbUpdate(up, php);
Официальная документация по Android хорошо объясняет это: Android AsyncTask.