Loader的簡單封裝、使用

對于android中的異步操作,有人說:2B青年用handler+thread,屌絲用AsyncTask,普通青年用Loader,而用rxjava的我都沒聽過Loader,為了做一個普通青年,所以決定學(xué)一學(xué)loader

網(wǎng)上的資料一大票的抄襲官方文檔,全是通訊錄的demo,所以我寫一個不一樣的,對loader進行一下簡單封裝,同時體會他的精髓。當然,用完之后,還是他媽的rxjava爽。

封裝一個用于做get請求的loader,代碼如下:

package com.xk.androiddemo;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.content.AsyncTaskLoader;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Iterator;

/**
 * Created by xuekai on 2017/12/6.
 */

public class NetGetLoader<T> extends AsyncTaskLoader<T> {
    private String url;

    public NetGetLoader(Context context, String baseUrl, Bundle params) {
        super(context);
        this.url = baseUrl;
        Iterator<String> iterator = params.keySet().iterator();
        //拼接參數(shù)的操作,具體如何寫,隨意發(fā)揮
        while (iterator.hasNext()) {
            String next = iterator.next();
            url = url + next + "=" + params.getString(next) + "&";
        }
    }


    @Override
    protected void onStartLoading() {
        //在這里可以做緩存處理:例如,對請求url、返回結(jié)果、請求時間進行存儲,這樣就可以實現(xiàn)同意請求,某段時間內(nèi)不走網(wǎng)絡(luò)。如果滿足條件,直接調(diào)用deliverResult(返回結(jié)果)即可把結(jié)果傳給主線程,否則調(diào)用forceLoad()走網(wǎng)絡(luò)。我這里方便起見,直接走網(wǎng)絡(luò)了。
   
        //調(diào)用該方法 走網(wǎng)絡(luò)
        forceLoad();
    }

    @Override
    public T loadInBackground() {
        //做網(wǎng)絡(luò)請求,把返回的json串轉(zhuǎn)成T類型,我這里用的是谷歌的gson,網(wǎng)絡(luò)請求是隨便copy的,具體根據(jù)情況發(fā)揮
        return doGet(url);
    }
    //自由發(fā)揮區(qū)
    private T doGet(String urlStr) {
        String result = null;
        HttpURLConnection conn = null;
        ByteArrayOutputStream bout = null;
        InputStream in = null;
        try {
            URL url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(8000 * 2);
            conn.setConnectTimeout(8000 * 2);
            byte[] buffer = new byte[1024];
            bout = new ByteArrayOutputStream();
            in = conn.getInputStream();
            int len = -1;
            while ((len = in.read(buffer)) > 0) {
                bout.write(buffer, 0, len);
            }
            result = new String(bout.toByteArray(), Charset.forName("UTF-8"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null)
                    in.close();
                if (bout != null)
                    bout.close();
            } catch (Exception e) {

            }
            if (conn != null)
                conn.disconnect();
        }

        try {
            Gson gson = new Gson();
            Type jsonType = new TypeToken<T>() {
            }.getType();
            return gson.fromJson(result, jsonType);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}

這樣就封裝了一個簡單的用于做get請求的loader,使用起來也很簡單

        private final int netget = 1;

        authorParams = new Bundle();
        authorParams.putString("id", "571");
        //指明loader類型,參數(shù)列表,callback中指明返回結(jié)果的類型和baseurl
        getSupportLoaderManager().initLoader(netget, authorParams, new Callback<Author>("http://baobab.kaiyanapp.com/api/v4/pgcs/detail/tab?"));


    class Callback<T> implements LoaderManager.LoaderCallbacks<T> {
        private String baseUrl;

        public Callback(String baseUrl) {
            this.baseUrl = baseUrl;
        }

        @Override
        public Loader<T> onCreateLoader(int id, Bundle args) {
            //根據(jù)標記,創(chuàng)建對應(yīng)的loader,這里id是netget,就創(chuàng)建之前封裝好的NetGetLoader
            switch (id) {
                case netget:
                    return new NetGetLoader(MainActivity.this, baseUrl, args);

            }
            return null;
        }

        @Override
        public void onLoadFinished(Loader<T> loader, T data) {
            Log.i("Callback", "onLoadFinished-->" + data);
        }

        @Override
        public void onLoaderReset(Loader<T> loader) {
        }
    }

loadermanager會被activity、fragment關(guān)聯(lián),所以我們不用考慮生命周期,不用擔心內(nèi)存泄漏,這是他的好處。

個人不太喜歡handler+thread的寫法,感覺把請求操作和處理請求結(jié)果的操作分離開,看起來很累,而這個loader也是類似的,所以還是覺的rxjava更好一點。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容