У меня есть класс AsyncTask внутри моего основного действия. Этот класс анализирует объект JSON, а затем устанавливает тексты на некоторые компоненты пользовательского интерфейса, такие как TextViews, EditTexts и т. Д. Проблема в том, что когда он устанавливает текст в первом TextView, он останавливается. Он не даст ошибку, но исключение «Только исходный поток, создавший иерархию представлений, может коснуться своего представления», что на самом деле означает, что вы не можете повлиять на какие-либо компоненты пользовательского интерфейса через AsynTask. Я читал, что это можно сделать через поток Runnable, но я не знаю, как это можно сделать в моем коде. Любые предложения будут более чем приветствуются !! Спасибо всем!AsyncTask для обновления текста в компонентах пользовательского интерфейса
public class PostDataAsyncTask extends AsyncTask<String, String, String> {
protected void onPreExecute() {
super.onPreExecute();
// do stuff before posting data
}
@Override
protected String doInBackground(String... params) {
String postResponse = "";
TextView txt_class = (TextView) findViewById(R.id.txt_class);
TextView v_points = (TextView) findViewById(R.id.txt_points);
//EditText name = (EditText) findViewById(R.id.fname);
try {
// url where the data will be posted
String postReceiverUrl = "http://server.com/Json/consumer.php";
Log.v(TAG, "postURL: " + postReceiverUrl);
// HttpClient
HttpClient httpClient = new DefaultHttpClient();
// post header
HttpPost httpPost = new HttpPost(postReceiverUrl);
// add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("ConsumerID", "52"));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// execute HTTP post request
HttpResponse response = httpClient.execute(httpPost);
HttpEntity resEntity = response.getEntity();
// Convert response to String
//String result = EntityUtils.toString(response.getEntity());
// TEST
postResponse = EntityUtils.toString(resEntity).trim();
// CONVERT RESPONSE STRING TO JSON Object
JSONObject json = new JSONObject(postResponse);
// Get the JSONArray "Consumer"
JSONArray ja = json.getJSONArray("Consumer");
//List<String> detailsList = new ArrayList<String>();
// Creating the array that will hold the json items
String[] info = new String[ja.length()];
// Loop through all fields
for (int i = 0; i < ja.length(); i++) {
JSONObject c = ja.getJSONObject(i);
// Storing each json item in variable
String id = c.getString("userid");
String fname = c.getString("userfullname");
String tel1 = c.getString("tel1");
String email = c.getString("email");
String address = c.getString("address");
String county = c.getString("county");
String country = c.getString("country");
String rpoints = c.getString("RedeemPoints");
String level = c.getString("Level");
Log.v(TAG, "User ID: " + id + "\n"+ "Username: "+ fname + "\n"+ "Redeem points: "+rpoints + "\n"+ "Level: "+level);
txt_class.setText("Domotel "+ level+" Member");
v_points.setText("TestTestTest");
}
//Log.v(TAG, "Testing response: " + postResponse);
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return postResponse;
}
@llias вы также можете вставить свой код операции –
@Haider Мой код активности очень прост. Инициализирует компоненты пользовательского интерфейса, а затем вызывает AsyncTask –
. Вы можете обновить их в AsyncTask ... просто не в 'doInBackground()', поскольку этот метод работает в фоновом потоке – codeMagic