У меня есть поток, который работает и делает запросы к серверу, и в соответствии с ответом от сервера я меняю цвет нескольких элементов в приложении.Проблема в том, что мне нужно изменить действие, и поток должен продолжать работать, чтобы делать запросы в этом новом действии, но когда я прихожу к основному действию, где мне нужно снова покрасить эти элементы, он их не закрасит.Я знаю, это потому, что когда поток впервые создается в основном действии, он имеет одну ссылку на это основное действие, которое удерживает угрозу, и когда я покидаю действие, он уничтожает его, а затем, когда я возвращаюсь, ссылка является новой, но ссылка наактивность, над которой я работаю над потоком, это старая, потому что я протестировал ее в режиме отладки и обнаружил, что.
Код потока такой:
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
}
Как я могу обновить активность, которая в данный момент выполняется внутри потока?