Как я могу обновить ссылку и активность в теме? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть поток, который работает и делает запросы к серверу, и в соответствии с ответом от сервера я меняю цвет нескольких элементов в приложении.Проблема в том, что мне нужно изменить действие, и поток должен продолжать работать, чтобы делать запросы в этом новом действии, но когда я прихожу к основному действию, где мне нужно снова покрасить эти элементы, он их не закрасит.Я знаю, это потому, что когда поток впервые создается в основном действии, он имеет одну ссылку на это основное действие, которое удерживает угрозу, и когда я покидаю действие, он уничтожает его, а затем, когда я возвращаюсь, ссылка является новой, но ссылка наактивность, над которой я работаю над потоком, это старая, потому что я протестировал ее в режиме отладки и обнаружил, что.

Код потока такой:

    public void initiateThreads(final boolean fromDisplayThread){


            if(!fromDisplay){
            t1= new Thread(new Runnable() {
                @Override
                public void run() {
                    final TextView text=(TextView) findViewById(R.id.textView);
                    final Timer timer = new Timer();
                    timer.schedule(new TimerTask() {


                        @Override
                        public void run() {

                            String url = "XX.XX.XX.XX";

                            Log.i("DREG", "onLoadMoreItems: " + url);

                            final StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                                    new Response.Listener<String>() {
                                        @Override
                                        public void onResponse(String response) {
                                            System.out.println(response);
                                            text.setText(response);

                                            try {

                                                JSONObject res = new JSONObject(response);
                                                String FRONT = res.getString("FRONT");
                                                String BACK= res.getString("BACK");
                                                String LEFT = res.getString("LEFT");
                                                String RIGHT = res.getString("RIGHT");

                                                setWarningLevel(FRONT, BACK, LEFT, RIGHT);

                                                setDelay();

                                                visualWarning(FRONT, BACK, LEFT, RIGHT);
                                            } catch (final JSONException e) {
                                                text.setText(e);
                                                Log.e(TAG, "Json parsing error: " + e.getMessage());
                                                runOnUiThread(new Runnable() {
                                                    @Override
                                                    public void run() {
                                                        Toast.makeText(getApplicationContext(),
                                                                "Json parsing error: " + e.getMessage(),
                                                                Toast.LENGTH_LONG)
                                                                .show();
                                                    }
                                                });

                                            }
                                        }
                                    },
                                    new Response.ErrorListener() {
                                        @Override
                                        public void onErrorResponse(VolleyError error) {
                                            if (error instanceof NetworkError) {
                                            } else if (error instanceof ServerError) {
                                            } else if (error instanceof AuthFailureError) {
                                            } else if (error instanceof ParseError) {
                                            } else if (error instanceof NoConnectionError) {
                                            } else if (error instanceof TimeoutError) {
                                                Toast.makeText(getApplicationContext(),
                                                        "Oops. Timeout error!",
                                                        Toast.LENGTH_LONG).show();
                                                text.setText(error);
                                            }
                                        }
                                    }
                            );
                            stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                                    10000,
                                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                            RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                            requestQueue.add(stringRequest);
                        }
                    }, 0, 2000);

                }
            });
            t1.start();
}

И функция, которая рисует элементы, это visualWarning(), а код:

 public void visualWarning(String FRONT, String BACK, String LEFT, String RIGHT){


            switch (FRONT) {//FRONT
            case "NONE":
                ImageView imageViewIcon1 = (ImageView) findViewById(R.id.imageView1);
                imageViewIcon1.setColorFilter(Color.parseColor("#0000D3"));

                ImageView imageViewIcon2 = (ImageView) findViewById(R.id.imageView2);
                imageViewIcon2.setColorFilter(Color.parseColor("#0000D3"));

                ImageView imageViewIcon3 = (ImageView) findViewById(R.id.imageView3);
                imageViewIcon3.setColorFilter(Color.parseColor("#0000D3"));

                ImageView imageViewIcon4 = (ImageView) findViewById(R.id.imageView4);
                imageViewIcon4.setColorFilter(Color.parseColor("#0000D3"));


//SWITCH STAEMENT CONTINUES BUT IT'S ALL THE SAME JUST CHANGING COLOR

}

Как я могу обновить активность, которая в данный момент выполняется внутри потока?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Используйте runOnUiThread для выполнения вашей части кода в главном потоке

public void onResponse(String response) {
    try {
        ....
        runOnUiThread(() -> visualWarning(FRONT, BACK, LEFT, RIGHT));
    }
}
0 голосов
/ 27 мая 2018

Как правило, неправильно хранить ссылку на активность в фоновом потоке.Вам нужны события, вы можете использовать LocalBroadcasts, отправлять широковещательную рассылку в свою деятельность всякий раз, когда вы получаете данные с сервера, вы будете получать широковещательные рассылки в действующей активности.

Обязательно отмените регистрацию трансляции в onDestroy ofдеятельность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...