編輯:關於Android編程
以前文章中對網絡加載數據過程都是一筆帶過,在這裡分析一種特殊情況:加載過程中,點擊取消加載。
異步加載數據過程,有人喜歡用AsyncTask,有人喜歡自己控制線程池來管理加載任務隊列,其實質是一樣的都是實現了異步加載。
加載網絡數據我大體分為兩類:
1、數據加載完,刷新頁面,一般用到等待框,比如新聞列表信息請求。
2、數據加載任務後台進行,不影響正常操作,比如,日志請求、數據已讀請求等。
那麼第一類就存在一種情況,在加載過程中,用戶不想等待了,點擊返回取消等待框。等待框取消證明用戶放棄該頁面加載,即要取消加載線程。
我們以實用AsyncTask來看以上功能的實現,直接上核心代碼:
public abstract class IsAsyncTaskextends 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); } }
數據加載過程與人機交互息息相關,如果控制不好,很可能多個線程去刷新一個界面數據,引起異常,所以要根據需求控制好每個異步加載任務。
JNINDK開發環境的搭建將NDK的路徑拷貝到環境變量path中 cmd中運行ndk-build可驗證是否添加成功JNI_HelloWorld步驟1.創建Android工
在研究源碼之前,我們對Handler的了解一般是這樣的概念:在主線程中,有消息隊列Looper,裡面有很多的消息,還有一個Handler,用來向Looper發送消息,Lo
關於如何對圖片進行模糊處理,網上方法比較多,常用而又便捷的方法就是使用高斯模糊,但網上的方法大多效果並不理想,今天分享一個之前項目中用到的模糊處理方法來實現高斯模糊,好了
Android Window、PhoneWindow、Activity學習心得第二彈Window 分析這裡先給出部分源碼 目錄(Android 4.4/framework