Ошибка Android Studio: «Метод getText () должен быть вызван из потока пользовательского интерфейса, текущий вывод – рабочий

Я создаю CRUD-операцию в студии Android, но я продолжал получать ошибки. Ошибка, когда я проверяю LogCat, это то, что они показывают мне

Строка 156-158
1907-1931 / com.example.casquejo.loginadmin E / AndroidRuntime: FATAL EXCEPTION: AsyncTask # 2 Процесс: com.example.casquejo.loginadmin, PID: 1907 java.lang.RuntimeException: Произошла ошибка при выполнении doInBackground (), вызванная : Java.lang.NullPointerException atcom.example.casquejo.loginadmin.NewProductActivity $ CreateNewProduct.doInBackground (NewProductActivity.java:85) в com.example.casquejo.loginadmin.NewProductActivity $ CreateNewProduct.doInBackground (NewProductActivity.java:58) atcom.example .casquejo.loginadmin.NewProductActivity $ CreateNewProduct.onPreExecute (NewProductActivity.java:67) atcom.example.casquejo.loginadmin.NewProductActivity $ 1.onClick (NewProductActivity.java:53)

Может кто-то мне помочь с этим или кто-то может дать понять, как это исправить? Ниже – это код для моего класса java EditProductActivity.class

package com.example.casquejo.loginadmin; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; /** * Created by Casquejo on 9/14/2015. */ public class NewProductActivity extends Activity { private ProgressDialog pDialog; JSONParser jsonParser = new JSONParser(); EditText inputName; EditText inputPrice; EditText inputDesc; private static String url_create_product = "http://10.0.2.2/android_connect/create_product.php"; private static final String TAG_SUCCESS = "success"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_product); inputName = (EditText) findViewById(R.id.inputName); inputPrice = (EditText) findViewById(R.id.inputPrice); inputDesc = (EditText) findViewById(R.id.inputDesc); Button btnCreateProduct = (Button) findViewById(R.id.btnCreateProduct); btnCreateProduct.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String name = inputName.getText().toString(); String price = inputPrice.getText().toString(); String description = inputDesc.getText().toString(); new CreateNewProduct().execute(name, price,description); } }); } class CreateNewProduct extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(NewProductActivity.this); pDialog.setMessage("Creating Product.."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } protected String doInBackground(String... args) { String name = args[0], price = args[1], description = args[2]; List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("name", name)); params.add(new BasicNameValuePair("price", price)); params.add(new BasicNameValuePair("description", description)); JSONObject json = jsonParser.makeHttpRequest(url_create_product, "POST", params); Log.d("Create Response", json.toString()); try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { Intent i = new Intent(getApplicationContext(), AllProductsActivity.class); startActivity(i); finish(); } else { } } catch (JSONException e) { e.printStackTrace(); } return null; } protected void onPostExecute(String file_url) { pDialog.dismiss(); } } } 

Идеал имеет в виду

  String name = txtName.getText().toString(); String price = txtPrice.getText().toString(); String description = txtDesc.getText().toString(); 

Чтение значений не должно быть проблемой, но для того, чтобы избавиться от этого предупреждения / ошибки, вы можете переместить его в onClick и передать значения через execute() . Например

 btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { String name = txtName.getText().toString(); String price = txtPrice.getText().toString(); String description = txtDesc.getText().toString(); new SaveProductDetails().execute(name, price, description); } }); 

Когда doInBackground вызывается, вы можете прочитать те bac, через прежние параметры, String... args . Три точки построены для varargs, а varargs могут быть доступны как массив, используя нотацию [] . В случае примера,

args[0] содержит значение name , args[1] содержит значение price а args[2] содержит значение description .

Вы вызываете getText() из фонового потока, созданного AsyncTask .

Сначала извлеките текст, а затем вызовите свою задачу async. Вот пример

 new SaveProductDetails() .execute(txtName.getText().toString(), txtPrice.getText().toString(), txtDesc.getText().toString()); 

И внутри метода SaveProductDetails doInBackground :

 String name = args[0], price = args[1], description = args[2]; 

В asynctask метод doInBackground(...) работает в фоновом (не-UI) потоке. Как вы можете видеть в приведенной ошибке, вам не разрешено взаимодействовать с элементами пользовательского интерфейса из фонового потока.

Вы можете либо передать аргументы в фоновый поток, как предложено в одном из других ответов, либо изменить свою асинтезу таким образом, чтобы значения строки пользовательского интерфейса считывались в onPreExecute() который выполняется в потоке пользовательского интерфейса (как Это метод onPostExecute() ).

 class SaveProductDetails extends AsyncTask<String, String, String> { private String name, price, description; @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(EditProductActivity.this); pDialog.setMessage("Saving product ..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); name = txtName.getText().toString(); price = txtPrice.getText().toString(); description = txtDesc.getText().toString(); } protected String doInBackground(String... args) { //... Use as you would before 

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

Вы можете прочитать это Использование переменных в потоке пользовательского интерфейса из рабочего потока .
В вашем вопросе вы пытаетесь получить доступ к тексту TextView из фонового потока. In-to быть последовательным, поскольку вы не должны этого делать, потому что возможно, что основной поток (поток потока пользовательского интерфейса TextView в то же время). Чтобы избежать таких пейзажей, вы можете сделать что-то вроде этого:

 class SaveProductDetails extends AsyncTask<String, String, String>{ //create constructor and pass values of text view in it String textViewValue1; public SaveProductDetails (String textViewValue1 ){ this.textViewValue1=textViewValue1 } //other code below } 

Вам не нужно передавать значение в метод execute. Задайте переменные имени, цены и описания как глобальные. Чтобы получить значение из EditTest на кнопке, щелкните по нему так:

Каждый раз, когда вам нужно щелкнуть по кнопке, чтобы получить данные JSON.

 btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { name = txtName.getText().toString(); price = txtPrice.getText().toString(); description = txtDesc.getText().toString(); new CreateNewProduct().execute(); } }); 

Теперь имя, цена и описание имеют значение, которое вы ввели.

Теперь ваш класс CreateNewProduct выглядит следующим образом:

 class CreateNewProduct extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(NewProductActivity.this); pDialog.setMessage("Creating Product.."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } protected String doInBackground(String... args) { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("name", name)); params.add(new BasicNameValuePair("price", price)); params.add(new BasicNameValuePair("description", description)); JSONObject json = jsonParser.makeHttpRequest(url_create_product, "POST", params); Log.d("Create Response", json.toString()); try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { Intent i = new Intent(getApplicationContext(), AllProductsActivity.class); startActivity(i); finish(); } else { } } catch (JSONException e) { e.printStackTrace(); } return null; } protected void onPostExecute(String file_url) { pDialog.dismiss(); } 

}