Как поставить следующий код в AsyncTask

Этот код предназначен для передачи значений на страницу 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();
}
}

Заранее спасибо!

0

Решение

Как это. Это очень простая реализация, но она охватывает вашу ситуацию.

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();
}
}
}
0

Другие решения

Вот хороший учебник по 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() метод.

0

Асинхронная задача — это класс, который можно вызывать внутри другого для выполнения 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;
0

Это будет что-то вроде следующего:

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.

0
По вопросам рекламы [email protected]