android 项目学习随笔六(网络缓存)

本文介绍了一种针对SharePreference的封装方法,并提供了一个网络缓存工具类的实现方案,该方案采用URL及其参数作为键,JSON数据作为值进行存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 对SharePreference的封装
import android.content.Context;
import android.content.SharedPreferences;

/**
 * 对SharePreference的封装
 * 
 * 
 */
public class PrefUtils {

    public static void putBoolean(String key, boolean value, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        sp.edit().putBoolean(key, value).commit();
    }

    public static boolean getBoolean(String key, boolean defValue, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        return sp.getBoolean(key, defValue);
    }

    public static void putString(String key, String value, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        sp.edit().putString(key, value).commit();
    }

    public static String getString(String key, String defValue, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        return sp.getString(key, defValue);
    }

    public static void putInt(String key, int value, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        sp.edit().putInt(key, value).commit();
    }

    public static int getInt(String key, int defValue, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        return sp.getInt(key, defValue);
    }

    public static void remove(String key, Context ctx) {
        SharedPreferences sp = ctx.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        sp.edit().remove(key).commit();
    }
}
View Code

2、 网络缓存工具类

import android.content.Context;

/**
 * 网络缓存工具类
 * 原则:
 * 以url+参数为key, 以json为value,保存起来
 * 
 */
public class CacheUtils {

    /**
     * 写缓存
     */
    public static void setCache(String url, String json, Context ctx) {
        //有时候,可以将缓存写在本地文件中, 以MD5(url)为文件名, 以json为文件内容保存
        PrefUtils.putString(url, json, ctx);
    }
    
    /**
     * 读缓存
     */
    public static String getCache(String url, Context ctx) {
        //如果缓存写在文件中, 先找文件MD5(url)存不存在,如果存在,说明有缓存
        return PrefUtils.getString(url, null, ctx);
    }
}
View Code

3、新闻中心示例

import java.util.ArrayList;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.Toast;

import com.google.gson.Gson;
import com.itheima.zhsh66.MainActivity;
import com.itheima.zhsh66.base.BaseMenuDetailPager;
import com.itheima.zhsh66.base.BasePager;
import com.itheima.zhsh66.base.impl.menudetail.InteractMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.NewsMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.PhotosMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.TopicMenuDetailPager;
import com.itheima.zhsh66.domain.NewsMenuData;
import com.itheima.zhsh66.global.Constants;
import com.itheima.zhsh66.utils.CacheUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;

/**
 * 新闻中心
 * 
 */
public class NewsCenterPager extends BasePager {

    // 菜单详情页集合
    private ArrayList<BaseMenuDetailPager> mMenuDetailPagers;
    private NewsMenuData mNewsMenuData;// 新闻分类信息网络数据

    public NewsCenterPager(Activity activity) {
        super(activity);
    }

    @Override
    public void initData() {
        System.out.println("新闻中心初始化...");
        tvTitle.setText("新闻");

        // 1.首先先看本地有没有缓存
        // 2.有缓存,直接加载缓存
        String cache = CacheUtils.getCache(Constants.CATEGORIES_URL, mActivity);
        if (!TextUtils.isEmpty(cache)) {
            // 有缓存
            System.out.println("发现缓存....");
            processResult(cache);
        }

        // 即使发现有缓存,仍继续调用网络, 获取最新数据
        getDataFromServer();
    }

    /**
     * 从服务器获取数据 需要权限: <uses-permission
     * android:name="android.permission.INTERNET"/>
     */
    private void getDataFromServer() {
        HttpUtils utils = new HttpUtils();
        utils.send(HttpMethod.GET, Constants.CATEGORIES_URL,
                new RequestCallBack<String>() {

                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        // 请求成功
                        String result = responseInfo.result;// 获取json字符串
                        // System.out.println("result:" + result);
                        processResult(result);
                        // 写缓存
                        CacheUtils.setCache(Constants.CATEGORIES_URL, result,
                                mActivity);
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        // 请求失败
                        error.printStackTrace();
                        Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
                                .show();
                    }
                });
    }

    /**
     * 解析json数据
     * 
     * @param result
     */
    protected void processResult(String result) {
        // gson->json
        Gson gson = new Gson();
        mNewsMenuData = gson.fromJson(result, NewsMenuData.class);
        System.out.println("解析结果:" + mNewsMenuData);

        // 获取侧边栏对象
        MainActivity mainUI = (MainActivity) mActivity;
        LeftMenuFragment leftMenuFragment = mainUI.getLeftMenuFragment();
        // 将网络数据设置给侧边栏
        leftMenuFragment.setData(mNewsMenuData.data);

        // 初始化4个菜单详情页
        mMenuDetailPagers = new ArrayList<BaseMenuDetailPager>();
        mMenuDetailPagers.add(new NewsMenuDetailPager(mActivity,
                mNewsMenuData.data.get(0).children));
        mMenuDetailPagers.add(new TopicMenuDetailPager(mActivity));
        mMenuDetailPagers.add(new PhotosMenuDetailPager(mActivity));
        mMenuDetailPagers.add(new InteractMenuDetailPager(mActivity));

        // 菜单详情页-新闻作为初始页面
        setCurrentMenuDetailPager(0);
    }

    // 给新闻中心页面的FrameLayout填充布局
    protected void setCurrentMenuDetailPager(int position) {
        BaseMenuDetailPager pager = mMenuDetailPagers.get(position);
        // 移除之前所有的view对象, 清理屏幕
        flContent.removeAllViews();
        flContent.addView(pager.mRootView);
        pager.initData();// 初始化数据

        // 更改标题
        tvTitle.setText(mNewsMenuData.data.get(position).title);
    }

}
View Code

 

<think>好的,我现在需要解决用户的问题:在Unity中针对Android平台实现Ping功能的代码示例或技术博客。首先,我需要回忆一下Unity中常用的网络检测方法。Ping功能通常用于检测网络延迟或可达性,但Unity本身是否有直接支持呢? 记得Unity的UnityEngine.Networking命名空间下有个Ping类,可能可以用来实现这个功能。比如创建Ping对象并发送请求到目标IP或域名,然后等待回复。不过要注意的是,在Android平台上可能需要处理权限问题,比如网络权限是否已经添加。 接下来,我应该检查用户提供的引用内容,看看有没有相关的信息。用户提供了四个引用,其中引用[1]是关于WebSocket客户端的C#代码,引用[2]提到Unity的Profiler工具,引用[3]和[4]涉及动画曲线和Unity开发基础分类链接。看起来这些引用中没有直接关于Ping的内容,所以可能需要依靠自己的知识库。 然后,我需要考虑在Unity中使用Ping的基本步骤。首先,确保在AndroidManifest.xml中添加网络权限。然后,在代码中创建Ping实例,启动协程等待响应,并获取时间。同时,要注意异步处理,避免阻塞主线程。此外,可能需要处理超时情况,以防Ping请求长时间无响应。 另外,用户可能需要示例代码,所以需要提供一个简单的Unity C#脚本,展示如何使用Ping类,并处理结果。同时,要提到在Android上的注意事项,比如权限设置和可能的平台差异。 最后,生成相关问题,帮助用户进一步了解相关主题,比如优化网络检测、处理异步操作、使用其他网络检测方法等。确保问题与用户的需求相关,并且引导他们深入探索。</think>在Unity中实现Android平台的Ping功能可通过UnityEngine.Networking.Ping类实现,需注意Android权限设置和异步处理。以下是具体实现步骤和示例代码: ### 一、基础实现方法 1. **添加网络权限** 在`Assets/Plugins/Android/AndroidManifest.xml`中添加: ```xml <uses-permission android:name="android.permission.INTERNET"/> ``` 2. **Ping核心代码** ```csharp using UnityEngine; using System.Collections; public class AndroidPing : MonoBehaviour { private Ping _ping; private float _timeout = 5f; private float _startTime; public void StartPing(string ip) { StartCoroutine(PingRoutine(ip)); } IEnumerator PingRoutine(string ip) { _ping = new Ping(ip); _startTime = Time.realtimeSinceStartup; while (!_ping.isDone && Time.realtimeSinceStartup - _startTime < _timeout) { yield return null; } if (_ping.isDone) { Debug.Log($"Ping成功!延迟:{_ping.time}ms"); } else { Debug.Log("Ping超时"); } } } ``` ### 二、Android平台注意事项 1. **多线程限制**:需在主线程执行网络操作,否则会触发`NetworkOnMainThreadException` 2. **异步处理**:建议结合Unity协程或UniTask实现异步等待[^4] 3. **ICMP限制**:Android 7+限制原生ICMP请求,可改用HTTP请求模拟检测 ### 三、替代方案(推荐) ```csharp IEnumerator CheckNetworkStatus(string url) { UnityWebRequest request = UnityWebRequest.Get(url); float startTime = Time.time; yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { float latency = (Time.time - startTime) * 1000; Debug.Log($"网络可达,延迟:{latency:F0}ms"); } else { Debug.Log("网络不可达"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值