android 取消網路載入過程

來源:互聯網
上載者:User

以前文章中對網路載入資料過程都是一筆帶過,在這裡分析一種特殊情況:載入過程中,點擊取消載入。

非同步載入資料過程,有人喜歡用AsyncTask,有人喜歡自己控制線程池來管理載入任務隊列,其實質是一樣的都是實現了非同步載入。

載入網路資料我大體分為兩類:

1、資料載入完,重新整理頁面,一般用到等待框,比如新聞列表資訊請求。

2、資料載入任務後台進行,不影響正常操作,比如,日誌請求、資料已讀請求等。

那麼第一類就存在一種情況,在載入過程中,使用者不想等待了,點擊返回取消等待框。等待框取消證明使用者放棄該頁面載入,即要取消載入線程。

我們以實用AsyncTask來看以上功能的實現,直接上核心代碼:

public abstract class IsAsyncTask extends        AsyncTask {    /**     * 載入進度條     */    private DialogLoading dialog_loading = null;        protected String exception;        protected Activity activity;    /**     * 是否顯示載入進度條 為了下拉和上拉重新整理不顯示載入進度條     */    private boolean isShow = true;    public IsAsyncTask(Activity activity) {        this(activity, true, true);    }    public IsAsyncTask(Activity activity, final DialogInterface.OnCancelListener l,            boolean isShow) {        this(activity, l, true, isShow);    }    public IsAsyncTask(Activity activity, final boolean cancelable, boolean isShow) {        this(activity, null, cancelable, isShow);    }    public IsAsyncTask(Activity activity, final DialogInterface.OnCancelListener l,            final boolean cancelable, boolean isShow) {        super();        this.activity = activity;        this.isShow = isShow;        if (null == dialog_loading && isShow) {            dialog_loading = new DialogLoading(activity);            dialog_loading.setCanceledOnTouchOutside(false);            dialog_loading.setCancelable(cancelable);            dialog_loading.setOnCancelListener(new DialogInterface.OnCancelListener() {                @Override                public void onCancel(DialogInterface dialog) {                    if (cancelable) {                        IsAsyncTask.this.cancel(true);                    }                    if (l != null) {                        l.onCancel(dialog);                    }                }            });        }    }    @Override    protected Result doInBackground(Params... params) {        return null;    }    @Override    protected void onPostExecute(Result result) {        super.onPostExecute(result);        if (null != activity && !activity.isFinishing() && dialog_loading != null) {            dialog_loading.dismiss();        }    }    @Override    protected void onPreExecute() {        super.onPreExecute();        if (null != activity && !activity.isFinishing() && dialog_loading != null && isShow) {            dialog_loading.show();        }    }}


過程分析:

1、建立這個非同步任務的時候,就要把是否顯示等待框isShow、是否允許取消cancelable。

2、當需要顯示等待框時候,建立、顯示並且綁定一個取消監聽,當等待框取消掉時候,也取消對應的非同步載入任務。

通過這樣簡單的把dialog和asynctask的綁定在一起,可以實現兩種非同步任務的載入,還可以實現等待框和載入任務的取消。

怎麼使用呢,來個例子:

首先實現asynctask

 private class GetPageHtmlDataTask extends            IshuguiAsyncTask {        private WebView webView;        public GetPageHtmlDataTask(Activity activity, WebView webView) {            super(activity, null, true);            this.webView = webView;        }        @Override        protected BSPageHtmlResBeanInfo doInBackground(String... params) {            BSPageHtmlResBeanInfo bsBeanInfo = null;            try {                bsBeanInfo = IshuguiLib.getInstance(activity).getBSPageHtmlBeanInfo(params[0],                        params[1], params[2], params[3], params[4], params[5]);            } catch (HttpRequestException e) {                exception = e.getMessage();                e.printStackTrace();            } catch (JSONException e) {                exception = e.getMessage();                e.printStackTrace();            }            return bsBeanInfo;        }        @Override        protected void onPostExecute(BSPageHtmlResBeanInfo result) {            if (exception != null) {                LogUtil.d(TAG, exception);                exception = null;                ToastAlone.showToast(activity, R.string.net_work_notcool, Toast.LENGTH_LONG);                super.onPostExecute(result);                return;            }            if (result != null) {                if ("0".equals(result.getPublicBean().getStatus())) {                    result.insertJsAndCssMethod(activity);                    setWebView(webView, result);                } else {                    ToastAlone.showToast(activity, R.string.request_data_failed,                            Toast.LENGTH_SHORT);                }            } else {                ToastAlone.showToast(activity, R.string.request_data_failed,                        Toast.LENGTH_SHORT);            }            super.onPostExecute(result);        }    }

getBSPageHtmlBeanInfo資料擷取協議時通過httpclient實現的,這個大家應該比較熟悉了。

這樣直接調用就可以了:

 if (NetworkUtils.checkNet(this)) {            if (getBSPageHtmlDataTask != null) {                getBSPageHtmlDataTask.cancel(true);            }            getBSPageHtmlDataTask = new GetBSPageHtmlDataTask(this, webVi_specialTopic);            getBSPageHtmlDataTask.execute(bsType, strId, "", "", "", clientAgent);        }


還有一種載入過程是跟activity一起消亡的話:

 @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        if (getBSPageHtmlDataTask != null) {            getBSPageHtmlDataTask.cancel(true);        }    }

資料載入過程與人機互動息息相關,如果控制不好,很可能多個線程去重新整理一個介面資料,引起異常,所以要根據需求控制好每個非同步載入任務。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.