ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시간 간격 후 사용자 지정 Webview 호출
    카테고리 없음 2020. 8. 12. 11:28

    질문

    URL을로드하기 위해 사용자 지정 웹보기를 만들었습니다. 완벽하게로드되지만 백그라운드에서 30 초마다 다시로드하고 싶은 문제입니다.

    ASYNC TASK에서 호출하려고 할 때마다 오류가 발생합니다. 이 문제를 해결하도록 도와주세요. 미리 감사드립니다. 아래 오류가 발생합니다.

    java.lang.IllegalStateException : UI 스레드가 아닌 다른 스레드에서 View 메서드 호출

    public class MPointAdvertiseView extends WebView {
    private static final int DEFAULT_ADVERTISE_WIDTH = 320;
    private static final int DEFAULT_ADVERTISE_HEIGHT = 50;
    private static final int DEFAULT_BANNER_TYPE = 0;
    
    private int mAdvertiseWidth = DEFAULT_ADVERTISE_WIDTH;
    private int mAdvertiseHeight = DEFAULT_ADVERTISE_HEIGHT;
    private String mAdvertiseID;
    
    private int mAdvertiseType = DEFAULT_BANNER_TYPE;
    
    
    public MPointAdvertiseView(Context context) {
        super(context);
    }
    
    public MPointAdvertiseView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    
    public MPointAdvertiseView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MPointAdvertiseView, defStyleAttr, 0);
    
        mAdvertiseWidth = a.getInteger(R.styleable.MPointAdvertiseView_banner_width, DEFAULT_ADVERTISE_WIDTH);
        mAdvertiseHeight = a.getInteger(R.styleable.MPointAdvertiseView_banner_height, DEFAULT_ADVERTISE_HEIGHT);
        mAdvertiseType = a.getInteger(R.styleable.MPointAdvertiseView_banner_type, DEFAULT_BANNER_TYPE);
        mAdvertiseID = a.getString(R.styleable.MPointAdvertiseView_advertise_id);
        a.recycle();
        initializeView(context, mAdvertiseID);
    }
    
    public MPointAdvertiseView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
    
    public void initializeView(final Context mContext, final String advertiseID) {
        getSettings().setJavaScriptEnabled(true);
    
        setWebViewClient(new WebViewClient());
    
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                loadAdvertise advertise = new loadAdvertise(mContext);
                advertise.execute(advertiseID);
            }
        }, 30000);
    }
    
    public void load(String url) {
        loadUrl(url);
    }
    
    public class loadAdvertise extends AsyncTask<String, Void, String> {
        private Context mContext;
    
        public loadAdvertise(Context mContext) {
            this.mContext = mContext;
        }
    
        @Override
        protected String doInBackground(String... params) {
            String adsURL = MPointAdvertise.getInstance().initializeAdverise(mContext, params[0], mAdvertiseWidth, mAdvertiseHeight, mAdvertiseType);
            return adsURL;
        }
    
        @Override
        protected void onPostExecute(String adsURL) {
            super.onPostExecute(adsURL);
            loadUrl(adsURL);
        }
    }
    }

    답변1

    UI 스레드 (기본 스레드)를 제외한 다른 스레드에서 UI 관련 요소를 변경할 수 없습니다.

    비동기 작업 대신 post.delayed ()와 함께 핸들러를 사용하거나 runonuithread ()를 사용할 수 있습니다.



    답변2

    "doInBackground"메서드에서 "MPointAdvertise"와 같은 뷰의 멤버에 액세스 할 수 없습니다."onPreExecute"또는 "onPostExecute"에서 호출을 시도하십시오.



    답변3

    이 시도:

    timer.schedule(new TimerTask(){
        @Override
        public void run(){
            post(new Runnable() {
                @Override 
                public void run() {
                    loadUrl(adsURL);
                } 
            });
    }, 30_000L);


    답변4

    AsyncTask 코드는 괜찮지 만 Timer를 사용하는 데 문제가 있습니다.

    "... 각 Timer 객체에 해당하는 것은 단일 백그라운드 스레드입니다. 타이머의 모든 작업을 순차적으로 실행합니다.

    따라서 Timer는 asynctask를 실행하기 위해 UI 스레드와 분리 된 새 항목을 만듭니다. 출력 : "UI 스레드가 아닌 다른 스레드에서 View 메서드를 호출합니다." View 메서드는 자체 스레드 내에서 작동합니다.

    핸들러를 사용하여 작업을 실행할 수 있습니다. 핸들러는 UI를 업데이트 할 수 있습니다.

    이것을 시도하십시오 :`

        Handler handler = new Handler();
        handler.postDelayed( new Runnable() {
            @Override
            public void run() {
                //Task's code
            }
        }, timeInMills );`


     

     

     

     

    출처 : https://stackoverflow.com/questions/48581075/custom-webview-call-after-time-interval

    댓글

Designed by Tistory.