Синглтон с Android - PullRequest
       28

Синглтон с Android

0 голосов
/ 01 августа 2020

У меня небольшие проблемы с правильным использованием шаблона singleton в моем студийном проекте android. Я создал textView в своем классе mainActivity, в котором я хочу установить для текста этого textView строковое значение переменной «a» в классе GrouseSingleton. Однако textView всегда отображается как «привет» (способ инициализации), а не как фактическая строка, которой он должен быть (это должно быть «в основном облачное небо», полученное с веб-сайта). Я предполагаю, что я неправильно установил переменную «а» в одноэлементном классе. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Ваш синглтон в порядке. Проблема в том, что вы создаете экземпляр класса GrouseSingleton и сразу после этого получаете значение a, которое является значением по умолчанию «hello». Таким образом, вам нужно использовать interface, как показано ниже, чтобы сообщить своему activity, когда значение a получено с сервера:

public interface ResultListener {
    void onResultFetched(int textViewId, String txt);
}

В вашей деятельности:

try {
     grouseSingleton = GrouseSingleton.getInstance(new ResultListener () {
        @Override
        public void onResultFetched(int textViewId, String txt) {
            TextView tv45 = findViewById(id);
            tv45.setText(txt);
        });
     grouseSingleton.startThread();
 } catch (IOException e) {
     e.printStackTrace();
 }
 

установите слушателя в свой GrouseSingleton класс:

private static ResultListener listener;
public static GrouseSingleton getInstance(ResultListener listener) throws IOException {
    if (instance == null) {
        instance = new GrouseSingleton();
        GrouseSingleton.listener = listener;
    }
    return instance;
}


public void startThread() throws IOException {
    new Thread() {
        public void run() {
            try {
                grouseWeather = Jsoup.connect("https://www.grousemountain.com/current_conditions#weather").get();
                runOnUiThread( new Runnable()
                {
                    public void run()
                    {
                        a = grouseWeather.select("h3.metric").first().text();  
                        listener.onResultFetched(txtViewId, a);
                    }
                });

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

}
0 голосов
/ 01 августа 2020

Весь код в порядке. Но проблема в том, что до загрузки данных textview установить значение по умолчанию hello. Данные после загрузки не могут обновить значение. Чтобы просто добиться этого, просто отправьте свой textView в качестве параметра при вызове вашего синглтона. например:

SingletonClass:

public class GrouseSingleton extends AppCompatActivity {

    private static GrouseSingleton instance = null;
    public Document grouseWeather;
    public String a = "hello";
    TextView textView;

    private GrouseSingleton(TextView textView) throws IOException {
        this.textView = textView;
        startThread();
    }

    public static GrouseSingleton getInstance(TextView textView) throws IOException {
        if (instance == null) {
            instance = new GrouseSingleton(textView);
        }
        return instance;

    }

    public void startThread() throws IOException {

        new Thread() {
            public void run() {
                try {
                    grouseWeather = Jsoup.connect("https://www.grousemountain.com/current_conditions#weather").get();
                    runOnUiThread( new Runnable()
                    {
                        public void run()
                        {
                            a = grouseWeather.select("h3.metric").first().text();
                            textView.setText(a);
                        }
                    });

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

    }
}

И из MAinActivity:

TextView tv45 = findViewById(R.id.textView45);
try {
   grouseSingleton = GrouseSingleton.getInstance(tv45);
} catch (IOException e) {
   e.printStackTrace();
}
tv45.setText(grouseSingleton.a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...