timezone-Android TimeZone long[]转换成int[]问题

问题描述

Android TimeZone long[]转换成int[]问题

androidM移植,发现日历崩溃,抓log如下:

 02-17 16:41:29.806  4921  4921 D AndroidRuntime: Shutting down VM
02-17 16:41:29.808  4921  4921 E AndroidRuntime: FATAL EXCEPTION: main
02-17 16:41:29.808  4921  4921 E AndroidRuntime: Process: com.android.calendar, PID: 4921
02-17 16:41:29.808  4921  4921 E AndroidRuntime: java.lang.ClassCastException: long[] cannot be cast to int[]
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZoneInfo.getTransitions(TimeZoneInfo.java:202)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZoneInfo.<init>(TimeZoneInfo.java:64)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZoneData.loadTzsInZoneTab(TimeZoneData.java:446)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZoneData.loadTzs(TimeZoneData.java:120)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZoneData.<init>(TimeZoneData.java:80)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZonePickerView.<init>(TimeZonePickerView.java:66)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.timezonepicker.TimeZonePickerDialog.onCreateView(TimeZonePickerDialog.java:72)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.Fragment.performCreateView(Fragment.java:2220)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.BackStackRecord.run(BackStackRecord.java:793)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:739)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:95)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:148)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:5417)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
02-17 16:41:29.808  4921  4921 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-17 16:41:29.811  3226  3353 W ActivityManager:   Force finishing activity com.android.calendar/.CalendarSettingsActivity

TimeZoneInfo.java的202附近代码如下:

     private static int[] getTransitions(TimeZone tz, long time)
            throws IllegalAccessException, NoSuchFieldException {
        Class<?> zoneInfoClass = tz.getClass();
        Field mTransitionsField = zoneInfoClass.getDeclaredField("mTransitions");
        mTransitionsField.setAccessible(true);
//此处出错
        int[] objTransitions = (int[])mTransitionsField.get(tz);
        int[] transitions = null;
        if (objTransitions.length != 0) {
            transitions = new int[NUM_OF_TRANSITIONS];
            int numOfTransitions = 0;
            for (int i = 0; i < objTransitions.length; ++i) {
                if (objTransitions[i] < time) {
                    continue;
                }
                transitions[numOfTransitions++] = objTransitions[i];
                if (numOfTransitions == NUM_OF_TRANSITIONS) {
                    break;
                }
            }
        }
        return transitions;
    }

跪求解决

解决方案

int[] objTransitions = (int[])mTransitionsField.get(tz);
不能这么写,在不考虑精度损失和溢出的情况下,可以这么写:

 long[] arr = mTransitionsField.get(tz);
int[] objTransitions = new int[arr.size()];
for (int i = 0; i < arr.size(); i++)
    objTransitions[i] = (int)arr[i];

解决方案二:

int[] objTransitions = (int[])mTransitionsField.get(tz);

“mTransitions”这个属性是long[]型的,不要强转为int[]

long[] objTransitions = (long[])mTransitionsField.get(tz);

解决方案三:

一个元素一个元素转吧,好像也没更好的方法。

解决方案四:

你移植的什么?系统啊!代码在这环境上怎么会有问题啊

时间: 2024-08-30 21:31:58

timezone-Android TimeZone long[]转换成int[]问题的相关文章

android中String转换成16进制的方法

问题描述 android中String转换成16进制的方法 想请教一下?把一个24个字节的字符串转换成16进制,并把结果打印出来要怎么写,网上有一些方法但是没有说转换完的16进制串打印出来要用哪个参数?求指点 解决方案 byte[] b = ""字符串"".getBytes();foreach (byte i : b){if (i < 16) System.out.print(""0"" + Integer.toHexS

Android 短信转换成彩信的消息数量(实例代码)

默认3条以上转为彩信 改为5条 路径vendor/mediatek/proprietary/packages/apps/Mms/src/com/android/mms/MmsConfig.java private static int sSmsToMmsTextThreshold = 6; // 4 变量定义字面意思就可以理解 以下是代码分析 vendor/mediatek/proprietary/packages/apps/Mms/res/layout/compose_message_acti

c++-为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1?

问题描述 为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1? <C++ Primer>第五版,中文版.p33. 1.999999999999999(比转换之后少是 2 的少个 9) 也是 1. 微软免费 IDE 2015.g++ 好像也一样. #include <iostream> using namespace std; int main() { double d = 1.9999999999999999; int i = d; cout

android studio-eclipse项目转换成Android studio项目,谁能帮我一下啊!

问题描述 eclipse项目转换成Android studio项目,谁能帮我一下啊! 看到的,会的,帮我一下吧! 你们谁把eclipse的项目转换成Android studio项目成功过,给我教一下,网上的能找到的方法我都试过了,可是项目到Android studio里面还是报错.我真的不会了,我在线等. 解决方案 参考下,具体情况要具体分析http://mobile.51cto.com/aengine-431948.htmhttp://my.oschina.net/skyhacker2/blo

字符-jdk1.5 String类型的表达式 计算结果转换成Int

问题描述 jdk1.5 String类型的表达式 计算结果转换成Int String str = "3*5+5"; JDK1.5 有没有什么函数可以计算str然后放入int? 还是得字符截取一步一步来? 感谢各位大神的回复.不能全部采纳实属无奈.所以从逻辑严谨的角度,采纳同时回答两个问题的回复.再次感谢 解决方案 没有,自己看一下后缀表达式算法,参考下面链接http://www.cnblogs.com/gmq/archive/2013/05/30/3108849.html 解决方案二:

mysql存储过程如何遍历字符串的每个字符,并把每个字符转换成int(假设都是数字字符)?

问题描述 mysql存储过程如何遍历字符串的每个字符,并把每个字符转换成int(假设都是数字字符)? 其实我就是想在存储过程中实现大整数的乘法,具体的算法参见http://blog.csdn.net/yeruby/article/details/12023733 怎么把这个算法变成mysql存储过程?求大侠解答.

Service层getParameter方法接受字符转换成int类型

String类型转化成int类型,不论哪种情况,在java中都能转化. 无论是在domain实体类中,还是在Dao(数据访问层),Service层(服务层)也行. 除去强制转换,项目开发总一共还有两种方法 public void getPost(HttpServletRequest request){ String str = request.getParameter("classId"): //方法一 int classId = Integer.parseInt(request.ge

在将 varchar 值 &amp;amp;#39;JAZZ&amp;amp;#39; 转换成数据类型 int 时失败。

问题描述 在将 varchar 值 'JAZZ' 转换成数据类型 int 时失败. 代码如下: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web

在将 nvarchar 值 &amp;amp;#x27;合格&amp;amp;#x27; 转换成数据类型 int 时失败。

问题描述 setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERPROCEDURE[dbo].[TeacherSchedule]@TeacherIdint,@CourseTypenvarchar(200),@Begindatetime,@EnddatetimeASdeclare@KpjsScheduleDateTimedatetime,@KpjsTimeIdint;declare@datetimedatetime,@weeknvarchar(250),@clas