Как добавить в основной макет imageView, управляемый из другого потока? - PullRequest
0 голосов
/ 26 октября 2011

Я делаю приложение для Android. Я достиг своей цели с одним основным потоком нажатием кнопки !!! (показать изображение, сохраненное на SD в ImageView) Но мне нужно сделать это с многопоточностью, чтобы сэкономить время и потому, что я буду создавать другие потоки.

Проблема, когда я делаю это в новом потоке, появляется предупреждение, которое говорит мне:

"Только оригинальная нить, создавшая иерархию представлений, может касаться ее просмотры ".

И изображение не открывается.

Вот этот код:

public class intsocketclient extends Activity implements  OnClickListener{
    public ImageView imagen;
        private Button connectPhones;              
        private Handler conectarhandler = null;
    private Runnable conectarunner = null;
public boolean condicion = true;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);    
            imagen = (ImageView) findViewById(R.id.imagen);
            connectPhones = (Button) findViewById(R.id.connect_phones);
            connectPhones.setOnClickListener(this);

            conectarhandler = new Handler();        
            conectarunner = new Runnable() { 
                public void run() {
                conectayenvia(); 
            conectarhandler.post(this);          

                }
          };                  
        }

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub.
     if(v==connectPhones) {              
         new Thread (conectarunner).start();                 
     }
}

public void conectayenvia () {
    if (condicion){              
                  condicion = false;
                  Bitmap bMap = BitmapFactory.decodeFile("/sdcard/recibido.jpg");
                  imagen.setImageBitmap(bMap);                                      
     }  
    }   
}

Но мне действительно нужно, чтобы это было так.

Можно ли взять основной макет (исходный файл "main.xml") и что-то вроде "добавить" поверх него другой основной файл ("threadmain.xml", который содержит только изображение), но также с возможностью нажатия кнопок и других вещей первого оригинального макета main.xml ????????

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

использует AsyncTask, так как он будет обрабатывать потоки автоматически, методы preExecute и postExecute AsyncTask запускаются в потоке пользовательского интерфейса.

  private class DF extends AsyncTask<Void, Void, Void>{
         private Bitmap bMap;
    @Override
    protected Void doInBackground(Void... params) {
                    if (condicion){              
              condicion = false;
              bMap = BitmapFactory.decodeFile("/sdcard/recibido.jpg");

                     }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
              imagen.setImageBitmap(bMap);                                      
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
}

вызовите asyncTask в onClick.

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub.
     if(v==connectPhones) {              
             new DF().execute();
     }
}
0 голосов
/ 26 октября 2011

Ваша проблема в том, что вы пытаетесь запустить методы пользовательского интерфейса не в потоке пользовательского интерфейса. Решение состоит в том, чтобы вызвать runOnUiThread из другого потока.

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