Android uygulamada thread kullanınca takılmalar çok yaşıyorum bunun yerine ne kullanabilirim ?

soruldu: 19 Ağu '15, 04:05

secrett's gravatar image

secrett
0253541
cevap kabul oranı: 0%


Thread'e alternatif olarak Timer ve AsyncTask sınıfları var.

Eğer bi süre delay verip ardından birşeyler "run" etmek istiyorsan,

Timer kullanmalısın.

Timer timer = new Timer();

timer.schedule(new TimerTask(){
@Override public void run() { //Yapılacak işlemler }
},0/*Yapılacak işlemden önceki "delay" süresi*/,1000/*Kaç milisaniyede bir tekrar edileceği*/);

Yukardaki kod bloğu "schedule()" edildikten "0" milisaniye sonra yazdığın kodları çalıştırır ve her 1000 milisaniyede bir tekrar tekrar işletir.

Aynı timeri

   timer.schedule(new TimerTask(){
    @Override public void run() { //Yapılacak işlemler }
    },0/*Yapılacak işlemden önceki "delay" süresi*/);

şeklinde kullanırsan, belirtilen delay süresi kadar bekler ve ardından yazdığın kod bloğunu sadece 1 kereliğine çalıştırır.

Bu arada timeri tekrar tekrar schedule edip kullanamazsın, tekrar çalıştırmak için "new" keywordü ile tekrar "instantiate" edip ardından "schedule" etmen gerekir.

permanent link

cevaplandı: 19 Ağu '15, 17:26

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 19 Ağu '15, 17:27

Öncelikle cevabınız için teşekkür ederim.Oyun uygulamasında ekrana bir resim basacağım ve o resim ekranda 2sn kaldıktan sonra kapanacak ve doğru bilindiği takdirde yeni resime geçilecek ve bu işlem level sonuna kadar devam edecek.

Resimleri switch case olarak ayırdım.Her case de bu yazılan kodları girdiğimde istediğimi elde etmiş olur muyum ?

(20 Ağu '15, 03:28) secrett secrett's gravatar image

timer.schedule(new TimerTask(){ @Override public void run() { runOnUiThread(new Runnable(){ @Override public void run(){

//Burda resmi kapatma işlemini yapın.

} }) }},2000);

eğer ki kullanıcı 2 saniyeden önce doğru bildiyse timer.cancel() metodunu çağırın.Bu şekilde muhtemelen istediğinizi elde edersiniz. Ayrıca emin değilim ama bildiğim kadarıyla "layout"'a dışardan bi threadden müdahele edilmiyor, o yüzden runOnUiThread() metodu içerisinde yaptırdım. Kodda parantez hataları olabilir onları düzeltirsiniz.

(21 Ağu '15, 02:21) ArnesTwin ArnesTwin's gravatar image

yazdığınız kodu uyarladım çalıştı ama şöyle bir sorunla karşılaştım.Ekrana il levelde çok hızlı bir şekilde basıp kapanıyor,diğer levellerde bazen hiç kapanmıyor bazende kapalı bir şekilde level atlıyor.Şimdi ben 2 tane timer kullanıyorum.Her 20 sn de bir doğru bilen timer,diğeri ise şu an sizin yazdığınız timer.Ben ikisinin çalışmasından dolayı kaynaklandığından sanıyorum sizce ?

(21 Ağu '15, 04:13) secrett secrett's gravatar image

2 tane timer yapmanıza gerek yoktu ki, bence şöyle yapın, resmi doğru/veya yanlış bildiğinde tetiklenen bi tane fonksiyon vardır. O fonksiyon içinde cevabın doğru olup olmadığını kontrol edin, eğer doğruysa timerı "cancel()" edin ve yeni levele geçin ve yeni levele geçince timerı tekrar "instantiate" ederek "schedule()" edin. Tam olarak ne yaptırdığınızı bilmiyorum ama algoritmayı böyle kurabilirsiniz.

(21 Ağu '15, 04:28) ArnesTwin ArnesTwin's gravatar image

Pardon yanlış söyledim o timer süreyi kontrol ediyor.Yaptığım uygulama oyun uygulaması.Level 1 den başlıyor ve ekrana 1 resim eger doğru ise level 2 olup resimler değişiyor.Süreyi 280 saniye yaptım.Benim istediğim level 1 de resim 3 saniye ekranda kalsın daha sonra kapansın ekran hafıza oyunu gibi düşünebilirsiniz.Eğer doğru bilinirse diğer levele ve resime geçsin o resimde 3 saniye kalıp kapansın tabi resimler level atladıkça zorlaşacak.

Şu an gördüğüm kadarıyla beni ayrı bir fonksiyon yazmam gerektiğine vardım.Timer,thread olmadı sanırım ayrı bir for döngüsünde fonksiyon yazmalıyım ?

(21 Ağu '15, 04:45) secrett secrett's gravatar image

Anladım şöyle yapabiliriz, resimi kullanıcıya gösterdikten hemen ardından timerla 3 saniye sonra kapanmasını ayarlıyoruz ve kullanıcının sizin senaryonuza göre doğru bilmesini bekliyoruz. Eğer kullanıcı bir cevap verirse sizin belirlediğiniz bir fonksiyon tetikleniyor, bu fonksiyon içinde öncelikle level 1 için belirlediğimiz 260 saniyelik süreyi kontrol eden timerı cancel() ediyoruz çünkü kullanıcımız artık cevap verdi. Eğer doğru ise yeni levele geçiyoruz ve 2 timerı da tekrar başlatıyoruz. Yani burdaki sizin takıldığınız nokta kullanıcı "cevap" verdiğinde bi fonksiyonunun tetiklenmemesi.

(21 Ağu '15, 04:57) ArnesTwin ArnesTwin's gravatar image

Timer her resim için ayrı ayrı koyulduğunda oyunun içinde takılmalar yaşanıyor.Toplu bir şekilde bunu düzenleyebilir miyiz ?Şu an takıldığım tek sorun bu ve 3 gündür yapmaya çalışıyorum.

(21 Ağu '15, 05:28) secrett secrett's gravatar image

Takılmalar muhtemelen "main thread"de yaptığınız işlemlerden kaynaklanıyor. Yani örneğin, bir butona bastınız, bu butonun arkasında uzun sürücek işlemler hesaplamalar yaptırırsanız, bu hesaplar yapılırken arayüzünüz donucaktır. Siz de muhtemelen bu şekilde zaman alıcak işlemler yaptırıyorsunuz. Bence buna benzer işlem yaptırdığınız "sync" işlemleri optimize edip donmaya sebep olabilicek yerlere bakın. Bunun dışında resimlerin render süresi de buna sebep oluyor olabilir. Örneğin, ben de uygulamamda bluetooth işlemleri için bir çok thread çalıştırıyorum bahsettiğiniz gibi bi problem yaşamadım.

(21 Ağu '15, 07:31) ArnesTwin ArnesTwin's gravatar image

Thread.sleep her level için ayrı ayrı ekleyip sizin dediğiniz gibi başka bir yerden müdahale edeceğim..

thread fonksiyonunu koymadan proje sorunsuz çalışıyor,threadleri koyduğum için yavaşladığını farkettim,takılmalar yaşandı.Ondan bu sorunun thread de olduğunu düşündüm.

(21 Ağu '15, 07:58) secrett secrett's gravatar image

Sen bilirsin ama main threadde "sleep" metodunu kullanırsan arayüz tamamen kitlenicektir.

(21 Ağu '15, 09:47) ArnesTwin ArnesTwin's gravatar image

Peki nasıl bir yol izlemeliyim ? Sizin dediğiniz thread sleep sandım.

(21 Ağu '15, 10:41) secrett secrett's gravatar image

Sizin dediğiniz gibi birşey yapıcak olsam ben timerlarla yapardım. Hatta android studioda değil de unityde yazardım. Yaptığınız uygulama başlı başına bir oyunsa cross-platform bir çözüm daha uygun olurdu.

(21 Ağu '15, 14:52) ArnesTwin ArnesTwin's gravatar image
12 yorumdan 5 tanesi gösteriliyor hepsini göster

dostum sora sora bitireceksin projeyi :) thread yerine timer task veya servis kullanabilirsin tabi ne yaptığına göre araştır biraz işine yarar birşeyler bulacaksın

permanent link

cevaplandı: 19 Ağu '15, 07:22

ibrahim472's gravatar image

ibrahim472
1.9k1614
cevap kabul oranı: 10%

:))) Araştırıyorum tabi burada da yardımcı olabileceklerini düşünüyorum ama ben yazıp bitirdikten sonra cevaplar geliyor genelde.Vazgeçmiyorum :))

TimerTask timerTask = new TimerTask() { @Override public void run() { } }; Timer timer = new Timer(); timer.schedule(timerTask, 0, 5000);

olarak kullandım.

(19 Ağu '15, 07:36) secrett secrett's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×819
×37
×31
×1

Soruldu: 19 Ağu '15, 04:05

Görüntüleme: 420 kez

Son güncelleme: 21 Ağu '15, 14:52

powered by BitNami OSQA