Soru & Cevap

Activityler arası veri set etme.. ...

09.10.2013 - 04:10

Merhaba,

Konu başlığı ne denli açıklayıcı oldu bilmiyorum lakin özetlemem gerekirse;

1 activity 1 class dosyam var;

vesselsearchdetails - Activity
wsVesselDetails - class
 

Yapmak istediğim wsVesselDetails classıma iş yaptırıp bu işin sonucununda aldığım string[] veriyi vesselsearchdetails activity deki bir textview e yazdırmak istiyorum. Bu iki dosyayı ayırmasaydım vesselsearchdetails activitiysinin içine wsVesselDetails classını yazsaydım activitydeki textview kontrolüne erişebilirdim. lakin ayrıdığımda erişemiyorum. 

Aşağıdaki gibi bir çözüm üretmeye çalıştım ters mantık ile wsVesselDetails içinde vesselsearchdetails create edip FindViewById ile konrole erişimtim veriyi set ettim. hiç hata yok. Ancak runtime da aşağıdaki hatayı alıyorum access vermiyor sanırım.


Görsel kaldırıldı.

Görsel kaldırıldı.

Görsel kaldırıldı.

 

 

7 Görüntülenme

6 Cevap

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

Profile picture for user ismailkaracaoglu
ismailkaracaoglu
11.10.2013 - 09:52

Teşekkür ederim Caner,

Sanırım bayram tatili bu listview ı doldurmak ile geçecek :)

picture-3606-1408610132.jpg
cgural
11.10.2013 - 03:13

Merhaba,

Verilerimi Textview değil de Listview e göndermek isteseydim nasıl yapabilirdim. 

Daha önce böyle bir şey yapmadım ama bulduğum bir örnek var bununla ilgili: http://stackoverflow.com/questions/14581103/use-base-adapter-with-asynctask-to-display-listview

Sizin de göreceğiniz gibi AsyncTask'tan Adapter'a bir veri döndürmek gibi bir yol yerine, özelleştirilmiş bir Adapter yazarak o Adapter içinde AsynTask çalıştırılmış. Bu da ListView'ın içini doldurmak için bir yöntem.

Bu arada illegal state exception almanızın nedeni, bir önceki mesajda değindiğim onCreate(Bundle)'i çalıştırmadan Activity'den bir şey isteyememe konusuyla ilgili.

Profile picture for user ismailkaracaoglu
ismailkaracaoglu
10.10.2013 - 03:42

Caner,

Verilerimi Textview değil de Listview e göndermek isteseydim nasıl yapabilirdim. Listview de adapter de tanımlamak gerekiyor iş biraz daha karışıyor. ( İşlediğim verileri ArrayList<VesselDetails> olarak değiştirdim.)

Daha doğrusu Liste değişkeni 5 er 5 er listelemek istediğim bilgileri barındırıyor. Aklıma listview de listelemek geldi. Başka bir obje ile listelemek mi mantıklıdır? Listview ile listelemek mi doğru olur?

Tabi listview için adapteri nasıl ekleyeceğimi bulamadım.. Ekte gönderdiğim gibi illegal state exception almaya başladım.

 

 

/sites/default/files/cevaplar/dosya/2020/file-adaptererror.png
Profile picture for user ismailkaracaoglu
ismailkaracaoglu
10.10.2013 - 08:55

Caner,

Tespit ve bilgilendirmelerin nokta atışı ve oldukça kritik benim için :) teşekkür ederim. Yönlendirmelerin sonucunda problemimi şu şekilde çözdüm.

Not: Weakreference pek takılma demişsin lakin bununla ilgili biraz açıklama yapabilir misin?

Görsel kaldırıldı.

Görsel kaldırıldı.

picture-3606-1408610132.jpg
cgural
09.10.2013 - 10:11

Yazdığınız AsyncTask sınıfında Activity'deki TextView'a erişmek için yanlış bir yol izliyorsunuz. Activity'nizi new ile örnekleyip ondan findViewById(int) ile bu şekilde değer alamazsınız, null döndürür (çünkü findViewById()'ye vereceğiniz int (R.id.falan) değerin, onCreate() aşamasında yüklenen XML'den alınıp işlenmesi icap eder, dolayısıyla o Activity'nin onCreate() olayını yaşaması gerekir. int değerin R.java'da yazılı olması ayrı bir şey. Bkz: en önce ilklendirilmesi gereken onCreate(Bundle)) ve dolayısıyla NullPointerException alırınız. 

UI thread'teki bir View'a doğrudan AsyncTask'ın sonucunu verecekseniz, o AsyncTask'ın yapılandırıcı/constructer metoduda o View'ın bi referansını geçmelisiniz/pass etmelisiniz. Kafa karıştıran şey şu belki de: onPostExecute(), UI thread üzerinde çalışıyor. Evet, AsyncTask sınıfının tasarım aşamasında verilen bir karar bu ve fakat bu bize o thread'te yaşayan, var olan her nesneye ve referansına doğrudan erişebileceğimiz anlamına gelmiyor. 

Bununla ilgili şurada güzel bir örnek var: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html AsyncTask'ın yapılandırıcısında, kullanıcıya sonucu bildirmek için bir ImageView'ın referansını almış. Bu referansı onPostExecute()'ta kullanıp o ImageView'a bir şeyler set ediyor. (Örnekteki WeakReferance'a aldırmayın. O performans ve bellek açısından güzel bir alışkanlık. Siz doğrudan şuna benzer bir şey deneyebilirsiniz: http://pastebin.com/ZqhsHELM)

Not: onPostExecute(String)'ta aldığınız parametreyi önceden doInBackGround()'ta işleyip, daha rafine bir biçime getirdikten sonra onPostExecute()'ta kullanabilirsiniz gibime geldi.

Profile picture for user sadettinpolat
sadettinpolat
09.10.2013 - 06:36

merhaba,

istediginiz islemi yapabilmek icin ya txtResult i parametre olarak wsWessellDetails classina soyleyebilirsiniz.

TextView txtResult degiskenini public olarak tanimlayin ve ss.execute metodunu cagirmadan once activty de ki textviewi findviewbyid ile bularak degerini set edin.