Soru & Cevap

Harici Bir Thread Sınıftan Ana Thread'e Veri Yollama

15.11.2014 - 02:08

Merhaba arkadaşlar,

Bluetooth kontrolü ile ilgili bir uygulama üzerinde çalışıyorum. Bluetooth bağlantısı, socket oluşturma ve veri alışverişi gibi işlemleri arka planda bir thread içinde yapmaya çalışıyorum. Bu thread sınıfını MainActivity içinde inner class olarak kullandığımda sorunsuzca handler sınıfına verileri geçirebiliyorum. Ancak uygulamam ilerledikçe kodlar ana sınıf içinde birikmesin diye bu thread sınıfını outer olarak tanımladım ama bu sefer bi türlü verileri ana sınıfa geçiremedim. Demek istediğim, ana sınıftaki handler(verileri toplayacak sınıfa) sınıfına dışardan ulaşamıyorum. Bahsettiğim kodlar aşağıdadır. Şimdiden teşekkür ederim.

mmHandler.obtainMessage(1, bytes, -1, buffer).sendToTarget();    ///////Outer thread sınıfımdan handler sınıfına mesaj gönderen kod

/////////Main activity içerisindeki veri toplayan Handler sınıfım

mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                byte[] gelenVeri = (byte[]) msg.obj;
                tvShowComingData.setText("Gelen Veri:" + msg.what);
                switch (msg.what) {
                case 1:
                    String gelenData = new String(gelenVeri);
                    tvShowComingData.setText("Gelen Veri:" + gelenData);
                    break;
                }
            }
        }; 

94 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-7494-1397646387.jpg
baranbuyuk
17.11.2014 - 04:04

Yapman gereken çok basit. Daha önce bu konu ile ilgili uzun bir post atmıştım. Nereye yazdığımı bulamadım. Fakat size mantığını söyleyeyim..

Öncelikle bir interface tanımlayın. Bu interfacin methodları olsun. Örnek olarak; onTaskStarted(): onTaskProgres() ve onTaskFinished(); şeklinde. Eğer, işlem sonucunda bir data gönderecekseniz, bunu da onTaskFinished() methoduna argüman ekleyerek yapın.

Şimdi, öncelikle, hangi sınıfta task sonucu ile ilgili işlem yapacaksanız bu interfacenizi o sınıfa implement edin. Siz implement ettiğiniz anda, zaten otomatikmen bu methodları override edeceksiniz. 

Şimdi gelelim task işinizi yapan outer sınıfa. private Interfaceismini interfaceIsmi; şeklinde bir varibale oluşturun ve bu variable ı, task sınıfının default constrouctoruna argüman olarak gönrederin.

taskİsmi(InterfaceIsmınız listener) şeklinde.. Daha sonra, Async task kullanıyorsanız, onPreExecute, onPostExecute ve onProgressUpdate methodlarının altına, sırası ile listene.onTaskStarted(), listener.onTaskFinished() ve listener.onTaskProgress() methodlarını çalıştırın.

Sonra yapmanız gereken tek şey, AsyncaTask tak = new MyAsyncTask(this); demeniz yeterli.

picture-1372-1408467635.jpg
ahmtbrk
16.11.2014 - 10:54
picture-830-1447858140.jpg
onur
15.11.2014 - 05:08

runOnUiThread() methodu ile activity'inin ui thread'inde çalıştırabilirsin dilediğin kodu