Оценете темата:
  • 0 гласа - средно 0
  • 1
  • 2
  • 3
  • 4
  • 5

Проблем с TextView
#1

На кратно, при опит да сетна на полето 
Код:
tv.setText(tet);

   android studioto гърми, 
Код:
Error:(40, 20) error: cannot find symbol variable tet

 Кода е:
Код:
public class MainActivity extends AppCompatActivity {
   TextView tv;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(layout.activity_main);
       tv = (TextView) findViewById(R.id.textView);

       Test tеt = new Test();
       tv.setText(tet);
       tеt.execute("http://checkip.amazonaws.com/");

   }


   public class Test extends AsyncTask<String, Void, Void> {

       @Override
       protected Void doInBackground(String... params) {
           HttpClient client = new DefaultHttpClient();
           HttpGet get = new HttpGet(params[0]);
           try {
               HttpResponse response = client.execute(get);
               InputStream is = response.getEntity().getContent();
               InputStreamReader isr = new InputStreamReader(is);
               BufferedReader br = new BufferedReader(isr);
               StringBuilder stre = new StringBuilder();
               String chun = null;

               while ((chun = br.readLine()) != null) {
                   stre.append(chun);
               }
               Log.d("D1", stre.toString()); //в конзолата взима ип-адреса

           } catch (ClientProtocolException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }

           return null;
       }

   }

}

Всичко по пермишъни е правилно, в конзолата се вижда резултата който трябва а именно IP адреса.
Моля, да няма хейт.
Благодаря на отзовалите се.



Цитирай
Аксесоари
#2

в случая tet е AsyncTask. Защо го set-ваш на textView-то. Мисля, че не е тип който да се сложи там. По скоро направи stre глобална променлива и сложи onPostExecute() на AsyncTask-а и там сложи tv.setText("" + stre);
Цитирай
#3

Отговора "проблема" е много прост: там където логваш ип-то в конзолата, там трябва да сетваш текста в тексвюто ти.
Цитирай
#4

(2017-03-09, 20:04:54)ndsbg написа:  Отговора "проблема" е много прост: там където логваш ип-то в конзолата, там трябва да сетваш текста в тексвюто ти.

мисля, че не е хубаво да се set-ва текста в doInBackground. За това му казах в оnPostExecute да го сложи. Така ще е сигурен, че вече е взел каквото е нужно и е готово да се изведе.
Цитирай
#5

(2017-03-09, 20:12:57)yo_asakura написа:  мисля, че не е хубаво да се set-ва текста в doInBackground. За това му казах в оnPostExecute да го сложи. Така ще е сигурен, че вече е взел каквото е нужно и е готово да се изведе.

Прав си, през телефона, го гледах кода и кажи режи видях само Log.d("D1", stre.toString()); //в конзолата взима ип-адреса

Та да си поправя поста тогава: връщаш резултата (демек стринга) и в onPostExecute си го сетваш, и за да избегнеш следваща тема и бъг трябва да направиш проверка 


Цитат:protected void onPostExecute(String result) {
   if(result !=null) {
//тука сетваш текста на текствюто
   } else {
//тука сетваш съобщение за грешка.
   }
}
Цитирай
#6

Нали след като е в doInBackground той е в отделна нишка и няма как да работи в UI.

Тествах по-горния начин като го поставих в AsyncTask
Код:
@Override
       protected void onPostExecute(Void aVoid) {
           super.onPostExecute(aVoid);
           tv.setText(""+ stre);
       }

Сега излиза NULL.
Пак ще поставя кода който съм сътворил,
Код:
public class MainActivity extends AppCompatActivity {
   TextView tv;
   public String stre;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(layout.activity_main);
       tv = (TextView) findViewById(R.id.textView);

       Test tеt = new Test();
       tеt.execute("http://checkip.amazonaws.com/");

   }


   public class Test extends AsyncTask<String, Void, Void> {
       @Override
       protected Void doInBackground(String... params) {

           HttpClient client = new DefaultHttpClient();
           HttpGet get = new HttpGet(params[0]);
           try {
               HttpResponse response = client.execute(get);
               InputStream is = response.getEntity().getContent();
               InputStreamReader isr = new InputStreamReader(is);
               BufferedReader br = new BufferedReader(isr);
               StringBuilder stre = new StringBuilder();
               String chun = null;

               while ((chun = br.readLine()) != null) {
                   stre.append(chun);
               }
               Log.d("D1", stre.toString());

           } catch (ClientProtocolException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }

           return null;
       }

       @Override
       protected void onPostExecute(Void aVoid) {
           super.onPostExecute(aVoid);
           tv.setText(""+ stre);
       }
   }

}



Цитирай
#7

Щом тук Log.d("D1", stre.toString()); ти извежда както трябва, значи stre е правилно получено. След това извеждането в onPostExecute трябва да си е нормално, а не Null. Много странно...

п.п. проблема ти е че 2 пъти дефинираш stre един път като String и един път StringBuilder
Това е работещия код. Добавих променлива bla (може да си я смениш) за да запаметим данните в нея:

Код:
public class MainActivity extends AppCompatActivity {

   TextView tv;
   public String bla;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       tv = (TextView) findViewById(R.id.textView);

       Test tеt = new Test();
       tеt.execute("http://checkip.amazonaws.com/");

   }


   public class Test extends AsyncTask<String, Void, Void> {
       @Override
       protected Void doInBackground(String... params) {

           HttpClient client = new DefaultHttpClient();
           HttpGet get = new HttpGet(params[0]);
           try {
               HttpResponse response = client.execute(get);
               InputStream is = response.getEntity().getContent();
               InputStreamReader isr = new InputStreamReader(is);
               BufferedReader br = new BufferedReader(isr);
               StringBuilder stre = new StringBuilder();
               String chun = null;

               while ((chun = br.readLine()) != null) {
                   stre.append(chun);
               }
               bla = stre.toString();
               Log.d("D1", bla);

           } catch (ClientProtocolException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }

           return null;
       }

       @Override
       protected void onPostExecute(Void aVoid) {
           super.onPostExecute(aVoid);
           tv.setText("" + bla);
       }
   }
}
Цитирай
#8

(2017-03-09, 22:30:15)yo_asakura написа:  Щом тук Log.d("D1", stre.toString()); ти извежда както трябва, значи stre е правилно получено. След това извеждането в onPostExecute трябва да си е нормално, а не Null. Много странно...

п.п. проблема ти е че 2 пъти дефинираш stre един път като String и един път StringBuilder
Това е работещия код. Добавих променлива bla (може да си я смениш) за да запаметим данните в нея:

Код:
public class MainActivity extends AppCompatActivity {

   TextView tv;
   public String bla;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       tv = (TextView) findViewById(R.id.textView);

       Test tеt = new Test();
       tеt.execute("http://checkip.amazonaws.com/");

   }


   public class Test extends AsyncTask<String, Void, Void> {
       @Override
       protected Void doInBackground(String... params) {

           HttpClient client = new DefaultHttpClient();
           HttpGet get = new HttpGet(params[0]);
           try {
               HttpResponse response = client.execute(get);
               InputStream is = response.getEntity().getContent();
               InputStreamReader isr = new InputStreamReader(is);
               BufferedReader br = new BufferedReader(isr);
               StringBuilder stre = new StringBuilder();
               String chun = null;

               while ((chun = br.readLine()) != null) {
                   stre.append(chun);
               }
               bla = stre.toString();
               Log.d("D1", bla);

           } catch (ClientProtocolException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }

           return null;
       }

       @Override
       protected void onPostExecute(Void aVoid) {
           super.onPostExecute(aVoid);
           tv.setText("" + bla);
       }
   }
}

Благодаря на всички, работи идеално :Smile Така стана.



Цитирай




Потребители разглеждащи темата: 1 гост(и)