Когда я изменяю текст и показываю его в пользовательском интерфейсе в потоке, ничего не делается (JAVA) - PullRequest
0 голосов
/ 16 июня 2019

Этот код находится в OnCreate в MainActivity

    inflater = getLayoutInflater();
    serversView = inflater.inflate(R.layout.layout_home, null, false);
    test = serversView.findViewById(R.id.titleDescription);

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try  {


                    //some code
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            test.setText(utf8text+"mk");

                            Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + " test.getText().toString():"+ test.getText().toString());
                        }
                    });


            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();

Использование класса Thread обязательно!Когда я регистрирую Log.i(LOG_TAG," test.getText().toString():"+ test.getText().toString());, все в порядке, текст меняется, но в интерфейсе ничего не делается.В чем проблема?

UPD: когда я это делаю:

runOnUiThread(new Runnable() { @Override public void run() { textView.setText(utf8text); Log.i(LOG_TAG,"textView.getText: "+ textView.getText().toString()); } });

и если textView находится в main_activity.xml, то он меняется.Но как сделать, например, использование LayoutInflater для получения и изменения TextView в другом фрагменте / упражнении?

Ответы [ 3 ]

0 голосов
/ 16 июня 2019

Пользовательский интерфейс не может быть обновлен не потоком пользовательского интерфейса, но android предоставляет класс android.os.Handler или классы AsyncTasks, ниже приведен пример кода для обработчика потока, попробуйте его.

public class MainActivity extends AppCompatActivity {
private ProgressBar progress;
private TextView text;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progress = findViewById(R.id.progressBar1);
    text = findViewById(R.id.textView1);
    handler = new Handler();
}
public void startProgress(View view) {
    // do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                doFakeWork();
                handler.post(new Runnable(){
                    @Override
                    public void run() {
                        progress.setProgress(value);
                        if(value!=10)
                            text.setText("updated");
                        else
                            text.setText("updating");
                    }
                });
            }
        }
    };
    new Thread(runnable).start(); }
    // Simulating something timeconsuming
private void doFakeWork() {
    try { SystemClock.sleep(5000);} catch (Exception e) {e.printStackTrace();}}}

Надеюсь, это поможет тебе, Удачи.

0 голосов
/ 16 июня 2019

Класс обработчика потоков, попробуйте.

public class MainActivity extends AppCompatActivity {

TextView test;
Handler handle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    test = findViewById(R.id.titleDescription);
    handle = new Handler();

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            test.setText("Hey! Text Changed");
        }
    };
    new Thread(runnable).start();

}

}

0 голосов
/ 16 июня 2019

Добавьте нижеприведенную строку в метод выполнения

serversView.invalidateViews ();

Пример,

public void run() {
    test.setText(utf8text+"mk");
    serversView.invalidateViews();
    Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + "test.getText().toString():"+ test.getText().toString());
}
...