Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Android Uygulama Arka Planda Kilitleniyor
#1
Merhaba, android de çok ilginç ve can sıkıcı bir hatayla karşı karşıyayım.

Uygulama ekranda açıkken telefon ekranı otomatik kapanınca veya kullanıcı tarafından ekran kapatılınca, kısa süre sonra telefonu açmak istediğinizde uygulama hatta telefon kilitleniyor. 10-20 saniye sonra telefon normale dönebiliyor.

Uygulama kullanırken bir sorun yok, en azından ben yakalayamadım ancak cihaz uyku moduna geçince bu hatayla karşılaşıyorum.
Sorun kodlarda mı yoksa başka bir şey mi var?

Delphi 10.2.1 kullanıyorum.

Şimdiden teşekkürler.
Cevapla
#2
db connection açık mı?
WWW
Cevapla
#3
Yok hocam verileri json ile alıyorum.
kullandığım thread kodunda sorun olabilir mi acaba.
Aşağıdaki yapıyı kullanıyorum.


TTask.Run(procedure
var
HTTP: TIdHTTP;
MS: TMemoryStream;
begin

    MS := TMemoryStream.Create;
    HTTP := TIdHTTP.Create(nil);
    try
      try

        HTTP.Get(url, MS);
        TThread.Queue(TThread.CurrentThread,
        procedure
        begin

        try
        MS.Position:=0;
        ListView.Items[id].Bitmap.LoadFromStream(MS);
        except
        //hata varsa hiç bir şey yapma
        end;

        end);
        Sleep(100);

      except
        MS.Free;

      end;
    finally

     if Assigned(HTTP) then begin HTTP.Free; end;
     if Assigned(MS) then Begin MS.Free; end;
    end;

end);
end;
Cevapla
#4
(25-12-2017, Saat: 23:27)beklentili Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlYok hocam verileri json ile alıyorum.
kullandığım thread kodunda sorun olabilir mi acaba.
Aşağıdaki yapıyı kullanıyorum.


TTask.Run(procedure
var
HTTP: TIdHTTP;
MS: TMemoryStream;
begin

    MS := TMemoryStream.Create;
    HTTP := TIdHTTP.Create(nil);
    try
      try

        HTTP.Get(url, MS);
        TThread.Queue(TThread.CurrentThread,
        procedure
        begin

        try
        MS.Position:=0;
        ListView.Items[id].Bitmap.LoadFromStream(MS);
        except
        //hata varsa hiç bir şey yapma
        end;

        end);
        Sleep(100);

      except
        MS.Free;

      end;
    finally

     if Assigned(HTTP) then begin HTTP.Free; end;
     if Assigned(MS) then Begin MS.Free; end;
    end;

end);
end;

İlgili Task nerede Run ediliyor ? Paylaştığınız koda göre sadece bir kere çalışıyor görünüyor. Ayrıca Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol da dikkat ile okumanızı öneriyorum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
Tuğrul hocam bir TComponent tipinde bir unit içerindeki procedure ile run ediliyor.

unit ortak_fonksiyonlar;

interface

uses .....;

type
  Tortak_fonksiyonlar = class (TComponent)

private

  public
    procedure setLogo(ListView: TListView; url: string; id: Integer);

end;


  Var
  Form_ortak_fonksiyonlar :Tortak_fonksiyonlar;

implementation


procedure Tortak_fonksiyonlar.setLogo(ListView: TListView; url: string; id: Integer);
begin
TTask.Run(procedure
var
HTTP: TIdHTTP;
MS: TMemoryStream;
begin

     MS := TMemoryStream.Create;
     HTTP := TIdHTTP.Create(nil);
     try
       try

         HTTP.Get(url, MS);
         TThread.Queue(TThread.CurrentThread,
         procedure
         begin

         try
         MS.Position:=0;
         ListView.Items[id].Bitmap.LoadFromStream(MS);
         except
         //hata varsa hiç bir şey yapma
         end;

         end);
         Sleep(100);

       except
         MS.Free;

       end;
     finally

      if Assigned(HTTP) then begin HTTP.Free; end;
      if Assigned(MS) then Begin MS.Free; end;
     end;

end);
end;
Cevapla
#6
Demek istediğim, neden bu Thread'den şüphe ediyorsunuz ? Sürekli bu thread'i mi çağırıyorsunuz ? (Yani setLogo metodu belirli periyotlar ile sürekli mi çağrılıyor). TThread.Queue kısmını ise diğer linkten dikkatlice incelemenizi öneriyorum yeniden.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
Hocam bence projeni 10.1.2 Berlinde test etmeni oneririm cunku tokyoda derlenen firemonkey uygulamalar çok sallantida calisiyor özelliklede threadlar cok problemli calisiyor ins. 10.3 de bu sikintilari giderirler.
Cevapla
#8
Tuğrul hocam, TThread.Queue(nil, şeklinde düzelttim. setlogo'yu listview de her item için çalıştırıyorum. Yaptığım testlerde bu alan çalışınca kilitlenme oluyor. Ancak işin garip tarafı sürekli bir kilitlenme söz konusu değil. Bazen de sorunsuz bir şekilde çalışabiliyor. Bu durumu tetikleyen başka bir şey mi var onu araştırıyorum. Umarım bir neticeye kavuşur. Teşekkürler.

codder71 hocam, Berlin üzerinde deneyeceğim. Teşekkürler.
Cevapla
#9
(28-12-2017, Saat: 01:59)beklentili Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlTuğrul hocam, TThread.Queue(nil, şeklinde düzelttim. setlogo'yu listview de her item için çalıştırıyorum. Yaptığım testlerde bu alan çalışınca kilitlenme oluyor. Ancak işin garip tarafı sürekli bir kilitlenme söz konusu değil. Bazen de sorunsuz bir şekilde çalışabiliyor. Bu durumu tetikleyen başka bir şey mi var onu araştırıyorum. Umarım bir neticeye kavuşur. Teşekkürler.

codder71 hocam, Berlin üzerinde deneyeceğim. Teşekkürler.

 Aslında anormal durumların olması bir tesadüf değil. Thread kodunuzun içine bir bakın; MS isimli TMemoryStream türündeki bir nesne thread içinde oluşturuluyor ve işlenmesi için bir başka thread'e (main thread) gönderiliyor(TThread.Queue ile). Ardından kısa bir bekleme zamanı (100 ms) koymuşsunuz ve thread içindeki nesneleri Free etmişsiniz.

 Ya ana thread meşgul ise ve 100 ms içinde ana thread'in kuyruğuna gönderdiğiniz metodu işleyemez ise ? Bu durumda, ana thread gönderdiğiniz metodu işleyemeden sizin thread'iniz MS isimli nesneyi zaten yok etmiş olacak ve ana thread Access Violation hatası alacaktır. Olmaz olmaz demeyin, thread programlamada herşey mümkündür.

Bu bağlamda daha güvenli bir yol tercih etmenizi öneririm.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
Ayrıca şu ana kadar birilerinin fark edip sizi uyarmasını ya da sizin fark etmenizi bekledim ama farkeden olmadığına göre kodunuz ile ilgili bir kaç kritik husustan da bahsetmek isterim:

procedure Tortak_fonksiyonlar.setLogo(ListView: TListView; url: string; id: Integer);
begin
TTask.Run(procedure
var
HTTP: TIdHTTP;
MS: TMemoryStream;
begin
    MS := TMemoryStream.Create;

     HTTP := TIdHTTP.Create(nil);
    try
      try

        HTTP.Get(url, MS);
        TThread.Queue(TThread.CurrentThread,
        procedure
        begin

        try
        MS.Position:=0;
        ListView.Items[id].Bitmap.LoadFromStream(MS);
        except
        //hata varsa hiç bir şey yapma
        end;

        end);
        Sleep(100);

      except
        MS.Free;

      end;
    finally

     if Assigned(HTTP) then begin HTTP.Free; end;
     if Assigned(MS) then Begin MS.Free; end;
    end;

end);
end;
  • try..except bloklarında hata saklanması, hata yokmuş gibi davranılması son derece hatalı bir tutumdur. Oluşan hatayı loglamak adına bir işlem yapılacak ise, o işlemden sonra hata raise; ifadesi ile yeniden tetiklenmelidir.
  • except bloğu içindeki MS.Free çağrımınız, ilgili thread'inizin multi free hatası oluşturmasına neden olacaktır. Çünkü, MS.Free ifadesi MS'in hafızada bir yer göstermesine engel değildir. Yani MS bu çağrımdan sonra da nil'den farklı bir değer içeriyor olacaktır. Dolayısı ile finally bloğundaki, if Assigned(MS) kontrolünden geçecek ve zaten Free edilmiş bir nesneyi yeniden Free edecektir. Bu sıkıntıyı bertaraf etmek için ya except bloğundaki MS.Free çağrımını silmelisiniz, ya MS.Free çağrımını FreeAndNil(MS) yapmalısınız. Ancak ben sizin yerinizde olsam ilgili try..except'i kaldırırdım. Dolayısı ile MS.Free ifadesini de. Çünkü, try..except bloğunda hiç bir şey yapmıyorsunuz.
Dikkatinizden kaçtığına inandığım bu hususlara daha fazla ehemmiyet gösterebilirseniz sizin adınıza çok daha faydalı olacağına inanıyorum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Question uygulama donma sorunu - webbrowser BY-HAYALET 8 635 07-09-2018, Saat: 13:26
Son Yorum: nehirnnn
  Firemonkey Android ile OCR ve Mifare - NFC - RFID Kütüphaneleri Abdullah ILGAZ 14 825 03-09-2018, Saat: 12:42
Son Yorum: adelphiforumz
  Android APİ sorunu - Google Play BY-HAYALET 23 1.125 23-08-2018, Saat: 18:54
Son Yorum: narkotik
  Uygulama arka plana geçince gelen hata abdullahcetinel 3 528 16-08-2018, Saat: 23:40
Son Yorum: apachi2006
  Tokyo Android Kurulumunda aldığım hata hakkında adelphiforumz 8 259 01-08-2018, Saat: 10:56
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi