2015-02-03 3 views
-1

У меня есть класс 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; 
     } 
+0

@llias вы также можете вставить свой код операции –

+0

@Haider Мой код активности очень прост. Инициализирует компоненты пользовательского интерфейса, а затем вызывает AsyncTask –

+0

. Вы можете обновить их в AsyncTask ... просто не в 'doInBackground()', поскольку этот метод работает в фоновом потоке – codeMagic

ответ

1

Вы должны обновить свой пользовательский интерфейс в onPostExecute своей AsyncTask.

+0

Пробовал, что тоже. Он не будет обновлять их, и я прочитал, что вы не можете играть с компонентами пользовательского интерфейса через AsyncTask ... –

+0

onPostExecute работает по ui thread –

Смежные вопросы