انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#1
سلام دوستان
بنده یک برنامه با استفاده از WebView ساختم.
حالا بعضی وقتا که دارم مطالب داخل WebView رو میخونم اکتیویتی جاری که WebView داخلشه خود به خود onDestroy میشه و میره داخل اکتیویتی قبل اون که لیست موضوعات هست.
حالا آیا کسی هست بدونه مشکل چیه؟؟؟
ممنون... Flower
پاسخ
 سپاس شده توسط zanyyy

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#2
سلام

فکر کنم مشکل از نشت حافظه در webview باشه که باعث میشه اندروید خودکار اون اکتیویتی رو OnDestroy کنه و شما برمیگردید به BackStack یعنی اخرین اکتیویتی که باز کردید یا شایدم برگردید به اکتویتی اول که ممکنه دلیل Restart شده برنامه شما باشه

webview در اندروید 4.4 به بالا از هسته chromium استفاده میکنه و در نسخه های پایین تز از هسته webkit که بیشترین موارد نشت حافظه مربوط به همین هسته webkit هستش که گفته شده باید با دقت ازش استفاده کنید و تنها null (Remove)کردن Webview کافی نیست و باید حتما Ondestroy بشه

کد:
if(webView != null) {
       webView.removeAllViews();
       webView.destroy();
   }
   webView = null;

 دنبال این مطلب بگردید Android WebView Memory Leak فکر کنم مطالب خوبی بتونید پیدا کنید
پاسخ
 سپاس شده توسط sinabelle ، admin ، zanyyy

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#3
خب دوستان گلم 
طبق گفته داش مهدی مشکل از webkit بود.
حالا میگم چطوری درستش کردم شاید بقیه دوستان هم این مشکل براشون پیش بیاد!!
خب قیبلش یه کلاس جدا به نام  NonLeakingWebView  درست کنید و کدهای زیرو درش قرار بدید:

کد پی‌اچ‌پی:
package com.webkit.kelidestan;

import java.lang.ref.WeakReference;
import java.lang.reflect.Field;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.webkit.WebViewClient;




public class 
NonLeakingWebView extends WebView {
 
   private static Field sConfigCallback;

 
   static {
 
       try {
 
           sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback");
 
           sConfigCallback.setAccessible(true);
 
       } catch (Exception e) {
 
           // ignored
 
       }

 
   }


 
   public NonLeakingWebView(Context context) {
 
       super(context.getApplicationContext());
 
       setWebViewClient( new MyWebViewClient((Activity)context) );
 
   }

 
   public NonLeakingWebView(Context contextAttributeSet attrs) {
 
       super(context.getApplicationContext(), attrs);
 
       setWebViewClient(new MyWebViewClient((Activity)context));
 
   }

 
   public NonLeakingWebView(Context contextAttributeSet attrsint defStyle) {
 
       super(context.getApplicationContext(), attrsdefStyle);
 
       setWebViewClient(new MyWebViewClient((Activity)context));
 
   }

 
   @Override
    public void destroy
() {
 
       super.destroy();

 
       try {
 
           ifsConfigCallback!=null )
 
               sConfigCallback.set(nullnull);
 
       } catch (Exception e) {
 
           throw new RuntimeException(e);
 
       }
 
   }


 
   protected static class MyWebViewClient extends WebViewClient {
 
       protected WeakReference<ActivityactivityRef;

 
       public MyWebViewClientActivity activity ) {
 
           this.activityRef = new WeakReference<Activity>(activity);
 
       }

 
       @Override
        public boolean shouldOverrideUrlLoading
(WebView viewString url) {
 
           try {
 
               final Activity activity activityRef.get();
 
               ifactivity!=null )
 
                   activity.startActivity(new Intent(Intent.ACTION_VIEWUri.parse(url)));
 
           }catch( RuntimeException ignored ) {
 
               // ignore any url parsing exceptions
 
           }
 
           return true;
 
       }
 
   }



بعد برای استفاده کافیه در لایه xml کدهای WebView رو اینجوری بنویسید:

کد:
  <com.webkit.kelidestan.NonLeakingWebView
           android:id="@+id/forces"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_alignParentTop="true"
           android:layout_centerHorizontal="true"
           android:background="#47aabd" />



تموم شد رفت...
ولی خوب این یکی از باگ های اندرویده و ممکنه باهم مشکلاتی باشه ولی بنده با این روش مشکلو رفع کردم و به اصطلاح Android WebView Memory Leak رو هک کردم.


یاعلی... Flower Flower
پاسخ
 سپاس شده توسط mahdi10539 ، admin ، zanyyy

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#4
سلام دوست عزیز خسته نباشید میشه بگید کلاس رو دقیقا تو چه پوشه ای باید ساخت کنار بقیه ی فایل های جاوا یا پوشه ی جدید میخواد...؟
پاسخ

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#5
(۱۳۹۴/۱۲/۰۲, ۰۵:۱۱ ب.ظ)mahmoud1373 نوشته: سلام دوست عزیز خسته نباشید میشه بگید کلاس رو دقیقا تو چه پوشه ای باید ساخت کنار بقیه ی فایل های جاوا یا پوشه ی جدید میخواد...؟

نه دادا تو پکیج اصلی برنامه کنار بقیه فایل های جاوا بساز
پاسخ

Destroy شدن خود به خود اکتیویتی شامل WebView (برنامه نویسی اندروید)

#6
سلام من این کلاس رو ساختم و تو لایوت برنامم فراخانی کردم ولی بازم از برنامه خارج میشه...بعضی وقتا با فورس کلوز بعضی وقتام بدون فورس کلوز در واقع من وقتی جاوا اسکریپت رو برای webView فعال میکنم اینطوری میشه وقتی جاوا اسکریپت غیرفعال باشه مشکلی نداره راهی هست بتونم این مشکل رو حل کنم...؟
پاسخ
 سپاس شده توسط شماره مجازی امارات


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان