Код из стороннего потока изменяет UI

117
31 марта 2021, 15:00

Во многих источниках говорится, что код из стороннего потока не может изменять экран приложения(UI) и для этого нужно использовать Handler, runOnUiThread() и т.д. Так почему мой поток созданный в onCreate() изменяет View на экране и приложение не выдает ошибку?

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_info);
        activity=this;
        intent = getIntent();
        final String[] selectionArgs = {""+intent.getLongExtra("id",-100)};
        oiNames = (TextView) findViewById(R.id.oiNames);
        oiPhone = (TextView) findViewById(R.id.oiPhone);
        oiDate = (TextView) findViewById(R.id.oiDate);
        oiCAddress = (TextView) findViewById(R.id.oiCAddress);
        oiTotalPayment = (TextView) findViewById(R.id.oiTotalPayment);
        llOIForItems =(LinearLayout)findViewById(R.id.llOIForItems);
        oillBackground = (ScrollView) findViewById(R.id.oillBackground);
       llFor1 = (LinearLayout)findViewById(R.id.llFor1);
        pBarOrder = (ProgressBar)findViewById(R.id.pBarOrder);
        final LayoutInflater inflater = getLayoutInflater();
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                MyDataBase mDB = new MyDataBase(activity);
                SQLiteDatabase sqlDB = mDB.getWritableDatabase();
                Cursor cursor = sqlDB.query(NAME_OF_CONNECTOR_TABLE,null,IDSH_CONNECTOR_TABLE+"= ?",
                        selectionArgs,null,null,null);
                Cursor cursorForProduct;
                if(cursor.moveToFirst()){
                    int idPColIndex = cursor.getColumnIndex(IDP_CONNECTOR_TABLE);
                    int amountColIndex = cursor.getColumnIndex(AMOUNT_CONNECTOR_TABLE);
                    int nameColIndex; //= cursor.getColumnIndex(NAME_PRODUCTS_TABLE);
                    int priceColIndex; //= cursor.getColumnIndex(PRICE_PRODUCTS_TABLE);*/
                    do{
                        View itemView = inflater.inflate(R.layout.item_order,null,false);
                        TextView itemName = (TextView)itemView.findViewById(R.id.itemName);
                        TextView itemAmount=(TextView)itemView.findViewById(R.id.itemAmount);
                        TextView itemPrice= (TextView)itemView.findViewById(R.id.itemPrice);
                        double val=0;

                        String[] idP = {""+cursor.getLong(idPColIndex)};
                        cursorForProduct = sqlDB.query(NAME_OF_PRODUCTS_TABLE,null,ID_PRODUCTS_TABLE+"= ?",
                                idP,null,null,null);
                        if(cursorForProduct.moveToFirst()){
                            nameColIndex = cursorForProduct.getColumnIndex(NAME_PRODUCTS_TABLE);
                            priceColIndex = cursorForProduct.getColumnIndex(PRICE_PRODUCTS_TABLE);
                            val= Double.parseDouble(cursorForProduct.getString(priceColIndex));
                            itemName.setText(cursorForProduct.getString(nameColIndex));
                            itemPrice.setText(String.format("%.2f",Double.parseDouble(cursorForProduct.getString(priceColIndex)) ));
                        }                            
                       itemAmount.setText(cursor.getString(amountColIndex));
                        totalPayment+=val*cursor.getLong(amountColIndex);
                        cursorForProduct.close();
                        llOIForItems.addView(itemView);
                    }while(cursor.moveToNext());
                }
                oiTotalPayment.setText(String.format("%.2f",totalPayment));
            }
        });
        t.start();
    }
READ ALSO
Билиотека для андроид

Билиотека для андроид

Только начал изучать андроид, хочу написать библиотеку для получения всех view на активностиНе могу нащупать точку входа

133
EventEmitter и проверка заполнения объекта

EventEmitter и проверка заполнения объекта

Есть события (events) на которые я подписываюсь (данные события делают запрос на сторонний сервис и получают информацию)После получения информации,...

94
Асинхроность при постановке команд в очередь

Асинхроность при постановке команд в очередь

Ajax запросы отрабатывают верно: получение статуса команды, удаление команды, постановка в очередьНе могу решить проблему, при клике осуществляет...

135
Упростить код JavaScript

Упростить код JavaScript

Я только начинаю изучать JS, возникла проблема, есть рабочий код, но сильно громоздкий и большой, помогите его упростить или уменьшить

110