msyz555明仕亚洲接口书写问题

( msyz555明仕亚洲 )

我的接口是这样子的,有返回的时候,json里面的data才会有值,不然就会是一个空字符串

同事跟我说,他接收的时候,data是用json转成对象去取,然后如果data是空,他整个程序就爆掉了,要么我data返回null,不能返回空。我就搞不明白真的是这样子吗

难道不用判断code值的吗?

确实是这样你原本的data是个对象,这里变成了数组他没做处理就会挂掉,你可以 $info[data] = new stdClass;//返回空对象
作为一个服务端我觉得应该对字段类型敏感处理。

你同事是不是用了框架去解析的json,让他手动解析一遍就好了。不要用框架。
不然框架不能判断data里面的[]这个是个空对象。
当然也可以在解析前判断一下code的值。

如果客户端代码写的不好的话,确实会这样。这锅甩给你了,要是你比他牛,你就甩回去;不然的话,接锅吧。。。

一般客户端都会使用类似于gson的框架去解析服务端返回的json数据,而数据格式是需要提前定义的。data既然是一个对象,那你就用对象的默认值null,我觉得这个需求也挺正常的。

我觉得这个就是,看谁好改 就谁改的问题啊 ~~
我觉得你说的也有道理,一般我同事他怎么给我方便返,我就怎么取。然后自己在做处理。
当然,具体问题具体分析吧~~

我觉得判断code的值比较好

作为API, 同一字段应该返回相同数据类型。
但是如果解决问题的话,使用code 也可以。
所以,如果在开发中就改接口,如果已经上线了,还是改接口。

(看完/读完)这篇文章有何感想! msyz555明仕亚洲的分享…

msyz555明仕亚洲Xamarin Jar Binding Library编译出错

( msyz555明仕亚洲 )

我新建了一个Jar Binding Library工程引入了一个Jar包,编译的时候报了如下的问题


我查官方文档说要在Metadata.xml里面加一句话我在里面加了如下的语句


但是编译还是出错,这个Jar包的属性我也调整成

请教各位大神

<add-node path="/api/package/class[implements[@name=java.lang.Comparable]]">
    <method name="compareTo" return="int" abstract="false" native="false" synchronized="false" static="false"
            final="false" deprecated="not deprecated" visibility="public">
      <parameter name="o" type="java.lang.Object" />
    </method>
  </add-node>

metadata.xml里面加这么一句话就ok了

(看完/读完)这篇文章有何感想! msyz555明仕亚洲的分享…

www.msyz555.comokhttp3 上传报internal server error

( www.msyz555.com )

我在用okhttp3上传照片带参数时,内容大于4M上传不成功,在onResponse的回调里,response的message显示internal server error,这是服务器的问题还是客户端的问题啊?

internal server error明显是服务器问题
建议试试直接上传确定服务器接口是否正常

(看完/读完)这篇文章有何感想! www.msyz555.com的分享…

msyz555明仕亚洲娱乐官网Android studio导入老版本的2048项目报错

( msyz555明仕亚洲娱乐官网 )

Android studio导入一个2048的项目

网上搜了下

方法一改了没反应
方法二改了以后
我又去百度
告诉我
这个的版本改旧一点,改成2.0.0,试了还是没用

在app/build.gradle

改下这一行
minSdkVersion 7

(看完/读完)这篇文章有何感想! msyz555明仕亚洲娱乐官网的分享…

www.msyz555.comjava.lang.IllegalStateException求指导

( www.msyz555.com )

测试同学跑Monkey跑出了这个异常导致的crash,对应的Android版本是Android6.0。
补充:出问题的Activity是使用了ViewPager无限循环展示图片,内容是ImageView,不是Fragment。
但是我的应用中没有用到任何Fragment,任何commit方法。详细Log如下:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLossFragmentManager.java:1438
    at android.app.FragmentManagerImpl.popBackStackImmediateFragmentManager.java:581
    at android.app.Activity.onBackPressedActivity.java:2537
    at android.app.Activity.onKeyUpActivity.java:2511
    at android.view.KeyEvent.dispatchKeyEvent.java:2695
    at android.app.Activity.dispatchKeyEventActivity.java:2764
    at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEventPhoneWindow.java:2384
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEventViewRootImpl.java:4687
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcessViewRootImpl.java:4643
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$AsyncInputStage.forwardViewRootImpl.java:4320
    at android.view.ViewRootImpl$InputStage.applyViewRootImpl.java:4182
    at android.view.ViewRootImpl$AsyncInputStage.applyViewRootImpl.java:4377
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$InputStage.applyViewRootImpl.java:4182
    at android.view.ViewRootImpl$InputStage.deliverViewRootImpl.java:4155
    at android.view.ViewRootImpl$InputStage.onDeliverToNextViewRootImpl.java:4208
    at android.view.ViewRootImpl$InputStage.forwardViewRootImpl.java:4174
    at android.view.ViewRootImpl$AsyncInputStage.forwardViewRootImpl.java:4353
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEventViewRootImpl.java:4523
    at android.view.inputmethod.InputMethodManager$PendingEvent.runInputMethodManager.java:2336
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallbackInputMethodManager.java:1940
    at android.view.inputmethod.InputMethodManager.finishedInputEventInputMethodManager.java:1931
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinishedInputMethodManager.java:2313
    at android.view.InputEventSender.dispatchInputEventFinishedInputEventSender.java:141
    at android.os.MessageQueue.nativePollOnceNative Method
    at android.os.MessageQueue.nextMessageQueue.java:328
    at android.os.Looper.loopLooper.java:164
    at android.app.ActivityThread.mainActivityThread.java:5811
    at java.lang.reflect.Method.invokeNative Method
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.runZygoteInit.java:844
    at com.android.internal.os.ZygoteInit.mainZygoteInit.java:734

在StackOverFlow上搜到了类似的问题:http://stackoverflow.com/ques…

StackOverFlow上说要重写onSaveInstaceState方法,去掉super调用,但是我不清楚这样做是否存在负作用,所以希望有经验的人指导一下如何解决这个问题。

我已经找到方法规避该问题,先自问自答一下。

问题原因:在使用了support-v4包中ViewPager的Activity,由于Android系统历史问题,会导致onSaveInstaceState方法调用时机出现不确定性。而onSaveInstaceState方法中会调用FragmentMananger的saveAllState方法。如果这个调用时机出现在onBackPressed方法之前,在onBackPressed方法中会判断是否已经存在saveAllState的行为,如果存在就抛出IllegalStateException。

解决方法:既然知道方法的原因,当然也就有了对应的解决方案。

方案1(也是我采用的方式——重写onBackPressed方法:

@Override
public void onBackPressed {
    finish;
}

方案二参考StackOverFlow上的做法——重写onSaveInstanceState方法:

@Override
protected void onSaveInstanceStateBundle outState {
    //No call for super. Bug on API Level > 11.
}

两种方法各有弊端,建议更清楚该问题的同学来回答一下这个问题,我抛砖引玉了。

(看完/读完)这篇文章有何感想! www.msyz555.com的分享…

www.msyz555.com自己 app 如何把 坐标 地址 传给 高德导航并 打开 高德导航app

( www.msyz555.com )

自己app 里面有很多店铺,点击店铺地址后,需要 打开 外部的 高德导航,并把地址 传给 高德导航

有大神可以指导一下吗

这种技术可以使用deeplink实现。具体你可google deeplink 或者 applink

有些介绍可以看这里deeplink

要打开外部地图,最简单的是用URI的方式,百度和高德都支持URI打开,详细参考高德开放平台

使用open url,高德地图的是

iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",@"导航功能",@"你的APP的scheme"

(看完/读完)这篇文章有何感想! www.msyz555.com的分享…

msyz555明仕亚洲Android 如果想要在要登录的时候,做弹出框,是做dialog好还是做一个透明主题的activity好?考虑到后面的联动.

( msyz555明仕亚洲 )

项目需求是:在没有登录的时候点击我的界面,弹出登录框,输入后请求判断是否为已注册用户,如不是则直接注册然后跳到设置密码界面,若是就直接跳到输入验证码界面,输入后登录.以上皆为弹出框的样式的.

这种情况下,考虑到登陆之后要显示用户的相关数据的话,自觉应该是activity比较合适的.
大神有什么好的方案求指教!!

我觉得采用dialog样式的activity,parent="@android:style/Theme.Dialog",可以利用activity的生命周期做很多事情

使用Dialog无法控制好生命周期,使用Dialog样式的Activity不能很好控制对话框样式,建议使用DialogFragment,这是带有Dialog的Fragment,你可以在xml文件中控制他的样式。同时也可以更好将UI和逻辑分开(使用回调)

简单的用Dialog,需求复杂的用Activity,Activity更加灵活,啥都能实现

逻辑较多,使用DialogFragment更好点,代码层次也会清晰点。

个人认为使用dialog样式的Activity好些。我用的这个https://segmentfault.com/a/11…

(看完/读完)这篇文章有何感想! msyz555明仕亚洲的分享…

www.msyz555.com初入RX,有一个需求不知道咋写?

( www.msyz555.com )

需求是这样的:我需要开启一个定时器A,当A定时到50秒的时候,开始开启第二个定时器B,A结束,B开始倒数10秒,每一秒发出一个通知:
然后,我用RX这样做了:

Observable<Long> observable =
                Observable
                        .timer50, TimeUnit.SECONDS
                        .repeat10
                        .delay1,TimeUnit.SECONDS;

        subscription = observable
                .observeOnAndroidSchedulers.mainThread
                .subscribeaLong -> {
                    //发通知倒计时
                    Log.e"note","flag";
                };

想了半天,好像没啥问题,但是跑起来就有问题了,发现,50秒时挺准的,然后到了第二个定时器,也就是.repeat10,最后打印的,按照理想,应该是每隔一秒打印,但是实际上相隔了好多秒!。。。
找了半天也没找出啥,难道是我理解错误这几个操作符了?求救大神!

1.repeat是重复,不是间隔固定时间进行重复,间隔固定时间的,用interval
2.delay是延迟发布,在repeat之后加delay,是在延迟后重复,而不是按delay参数进行间隔重复
3.解决方案是用 interval,可以指定初始延迟,重复间隔,再加上take和map操作,取前10个并转换成倒计时

Observable.interval50, 1, TimeUnit.SECONDS//延迟50s,然后每1秒重复
          .take10//取10个
          .mapaLong -> 10 - aLong//转换成倒计时
          .subscribeYOUR_ACTION;

尚未找出原因,但我找到一个替代版本:

/**
     * 倒计时,倒计 time 秒
     * @param time  单位:秒
     * @return  Observable
     */
    public static Observable<Integer> countDownint time {
        if time < 0 time = 0;
        final int countTime = time;
        return Observable.interval0, 1, TimeUnit.SECONDS
                .subscribeOnSchedulers.newThread
                .mapincreaseTime -> countTime - increaseTime.intValue
                .takecountTime + 1;
    }

这是一个倒计时,然后,在前面加上延时就可以了:

private final static int TheMaxRecordTime = 60;     //最大录音时长:秒
private final static int NoteUserRecordTime = 10;   //剩余多少秒开始提示用户
 Observable<Integer> observable = Observable
                .timerTheMaxRecordTime-NoteUserRecordTime+2, TimeUnit.SECONDS
                .flatMapaLong -> RxUtils.countDownNoteUserRecordTime;

        subscription = observable
                .observeOnAndroidSchedulers.mainThread
                .subscribeaLong -> {
                    setLeftTimeaLong;
                    if aLong==0
                        EventBus.getDefault.postnew EventMsgEventMsg.MessageType.Record_Time_Out;
                };

(看完/读完)这篇文章有何感想! www.msyz555.com的分享…

msyz555明仕亚洲如何在安卓真机上调试react-native

( msyz555明仕亚洲 )

小米手机,怎么调试react-native程序?写完代码看不到后台,也没找到那个摇一摇就出现的调试模式,求科普!!!

miui 会默认关闭 App 的悬浮窗权限,因此你看不到摇一摇出现的调试悬浮窗。去设置里面打开相应 react native app 的悬浮窗权限就可以了。

摇一摇就有的啊, 当初玩的时候真是震惊了,第一次真机部署要usb链接, 然后拔了线连wifi就能开发调试了

可以看看这个小哥写的一个demo 音乐类app https://github.com/chunmu/RNM…
项目里面有对一些常见问题和常用库进行列出 有看头

(看完/读完)这篇文章有何感想! msyz555明仕亚洲的分享…