Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 取消網絡加載過程

android 取消網絡加載過程

編輯:關於Android編程

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

異步加載數據過程,有人喜歡用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);
        }

    }

數據加載過程與人機交互息息相關,如果控制不好,很可能多個線程去刷新一個界面數據,引起異常,所以要根據需求控制好每個異步加載任務。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved