Articles of java的

嵌套片段 – IllegalStateException“onSaveInstanceState后无法执行此操作”

背景 Android中的异步回调 尝试在Android上以可靠的方式执行异步操作是不必要的错综复杂的,即AsyncTask在概念上是否真的有缺陷,或者我只是缺少某些东西? 现在,这是在引入Fragments之前的全部内容。 随着Fragments的引入, onRetainNonConfigurationInstance()已被弃用。 所以最新的Google宽恕黑客就是使用一个持久的非UI片段,当发生配置更改时(即旋转屏幕,更改语言设置等),它会从您的Activity中附加/分离。 示例: https : //code.google.com/p/android/issues/detail?id = 23096#c4 IllegalStateException – 无法在onSaveInstanceState之后执行此操作 从理论上说,上面的黑客可以让你绕过可怕的: IllegalStateException – “Can not perform this action after onSaveInstanceState” 因为持久的非UI片段将接收onViewStateRestored()(或者onResume)和onSaveInstanceState()(或者onPause)的回调。 因此,您可以判断实例状态何时被保存/恢复。 对于这么简单的事情来说,这是相当多的代码,但是利用这些知识,您可以排队异步回调,直到活动的FragmentManager在执行它们之前将其mStateSavedvariables设置为false。 mStateSaved是最终负责触发此exception的variables。 private void checkStateLoss() { if (mStateSaved) { throw new IllegalStateException( “Can not perform this action after onSaveInstanceState”); } if (mNoTransactionsBecause != null) { throw new […]

如何在android中切换方向锁?

我想在我的偏好Activity中创建checkbox,允许用户切换方向更改。 在类似的问题中,人们只编写完整的方向锁(通过覆盖onConfigurationChanged方法或在AndroidManifest.xml中添加configChanges)或方向强制(通过setRequestedOrientation)。 有没有办法切换方向锁? 编辑:我创建了一个方法,将首选方向设置为三种状态之一:横向,纵向和传感器。 此方法与检索方向getResources().getConfiguration().orientation)结合使用,并将检索到的方向保存到首选项中。 然后在需要锁定方向的活动中,我使用首选项的首选方向来激活此方法。 private static void setActivityOrientation(Activity activity, int preferenceOrientation) { if (preferenceOrientation == Configuration.ORIENTATION_LANDSCAPE) { if( activity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){ // You need to check if your desired orientation isn’t already set because setting orientation restarts your Activity which takes long activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } else if (preferenceOrientation == Configuration.ORIENTATION_PORTRAIT) { if( activity.getRequestedOrientation() […]

Android随机错误java.lang.NoClassDefFoundError:com.facebook.internal.Utility

我正在使用最新的Facebook Android SDK,并在我最新发布的apk中从我的远程崩溃控制应用程序中的数十个用户那里获得该错误。 我在这里看到了这样的错误,但是大多数答案对于最后一个FB SDK来说太过时了,在这种情况下有两种奇怪的情况: a)错误似乎是随机发生的。 在我的所有设备上,我都无法重现它。 b)在该版本和前一版本之间FB逻辑没有任何变化,在之前的版本中我从未遇到过这样的错误。 由于我在这些版本之间的代码中找不到任何相关的差异,我认为问题是Android Tools在生成最后一个apk时可能发生的错误,但是给出的事实是我正在使用的那个apk和一直无法重现问题,尽管数十个或用户受到影响,数百个使用相同的apk都没有,我也放弃了这样的假设。 任何关于如何解决或只是调试这个东西的想法都是受欢迎的。 更多可能相关的信息: 所有崩溃都发生在Android 4.0.3或更早版本中。 最高百分比是2.3.6,占所有崩溃的48%。 该类实际上是在APK中导出的 。 我通过解压缩apk并使用dexdump查看classes.dex内部的内容来检查它。 我无法想到其他的东西,因为它在我的所有设备中都能完美运行,如果class级不在那里,它就不会。 $〜/ android-sdks / build-tools / 21.1.1 / dexdump classes.dex | grep’com.facebook.internal.Utility $ 1’类描述符:’Lcom / facebook / internal / Utility $ 1;’ #0 :(在Lcom / facebook / internal / Utility $ 1;)#1 :(在Lcom / facebook / internal […]

图像需要太长时间才能加载?

编辑: 在进行方法跟踪后,每当我用紫色方块切换时,图形会上升很多。 当我用蓝色或绿色圆圈切换时,它会保持低位: 以下是与紫色方块交换的方法: 我有一个应用程序交换两个按钮。 有一个红色按钮,当它被点击时,它从其他三个按钮中选择一个随机按钮,并交换。 我尝试通过交换图像来做到这一点。 在onClickListener中,我只使用带有红色按钮的按钮来监听点击。 获取随机图像 把它留空 寻找红色按钮 给出随机图像的红色按钮背景(交换) 给出随机图像(现在是空白的)红色背景 如果这令人困惑……请留下它。 但: 每当我将图像从较大的图像切换到较小的图像时,该过程需要更长的时间。 在两个较小的图像之间交换时要快得多。 我该如何解决。 是否有一个最适合Android的图像大小? 这是布局代码: https://gist.github.com/anonymous/813883bce89606d2a82e 正如你在图像中看到的那样,用蓝色圆圈比用紫色方块交换背景图像要花费更多(很多!)。 为什么…? 根据图像尺寸,为什么(我只是更改图像并检查带红色图像的按钮)的速度较慢? 我应该使用什么图像尺寸? 非常感谢你的时间

单身人士与Android中的应用程序上下文?

回顾这篇文章列举了使用单例的几个问题,并看过使用单例模式的Android应用程序的几个例子,我想知道使用Singletons而不是通过全局应用程序状态共享的单个实例是一个好主意(inheritanceandroid.os.Application并获取它通过context.getApplication())。 两种机制都有哪些优点/缺点? 说实话,我希望在这篇文章中使用Web应用程序的单例模式得到相同的答案,不是一个好主意! 但适用于Android。 我对么? DalvikVM有什么不同呢? 编辑:我想就所涉及的几个方面提出意见: 同步 可重用性 测试

在AndroidStudio 3.0.1中,DialogFragment getActivity()“可能为空”lint警告

我能find的最接近的现有问题是Android Studio 3.0 lint警告,用于引用活动 ,但它没有帮助。 使用AndroidStudio 3.0.1,我有一个DialogFragment ,我通常会这样做: @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); … 我有一个lint警告呻吟我, Argument ‘getActivity()’ might be null 。 我理解为什么 getActivity()可能为null,我理解lint检查如何知道这一点(来自@Nullable注释)。 我的问题是: getActivity()可能是空的,这一切都非常好,但实际上我应该如何优雅和整洁地处理这个问题呢? onCreateDialog 必须返回一个Dialog (因为超类’ @Nullable注释),所以我必须有Activity上下文来创建它。 如果DialogFragment没有附加到Activity,我可以假设onCreateDialog永远不会被调用,但是 – 我如何处理不整齐的lint警告?

Firebase存储exception与Crashlyticsexception不匹配?

我正在使用Firebase在Android上下载文件。 这是我的代码: try { //.. Try to download file from Firebase } catch(StorageException e) { if(e.getErrorCode() == StorageException.ERROR_RETRY_LIMIT_EXCEEDED) { //Ignore! Exception has occurred due to no Internet availability } else { //Other genuine failure, log it Crashlytics.logException(e); } } 现在,此代码不会发送“已超出操作重试限制”。 例外。 但是,在Crashlytics中,我仍然可以看到报告此exception。 Non-fatal Exception: com.google.firebase.storage.StorageException The operation retry limit has been exceeded. Caused by javax.net.ssl.SSLException […]

读取输入流时出错:软件在java服务器中导致连接中止

我基本上是想在Android设备上托管服务器。 客户端设备通过TCP连接到服务器并发送请求。 服务器执行客户端请求的操作,然后将数据写回套接字。 连接未被服务器终止,并且将通过套接字连续读取请求并回复。 注意:每个请求消息的前4个字节包含实际消息/请求的长度。 parseXmlInputAndExecuteCmd函数根据输入XML字符串的内容执行各种异步操作。 这最终会导致’allowResponse’variables的布尔值更改为true,并生成某个响应,该响应存储在名为’response’的Stringtypes的variables中。 一旦布尔值’allowResponse’变为true,线程就会恢复执行并将响应写回套接字的OutputStream 其中一些异步操作包括连接和断开与公司VPN的连接。 这可能是错误的原因吗? 使用的一些类级variables是: private volatile boolean allowResponse = false; private String response; 服务器代码: private void startServer() { try { ServerSocket serverSocket = new ServerSocket(8080); while (true) { Socket connectionSocket = serverSocket.accept(); BufferedInputStream bufInpStream = new BufferedInputStream(connectionSocket.getInputStream()); BufferedOutputStream bufOutStream = new BufferedOutputStream(connectionSocket.getOutputStream()); ByteArrayOutputStream contentLengthBaos = new ByteArrayOutputStream(); int […]

dex2jar和jd-GUI的替代品?

似乎dex2jar和/或jd-GUI即使对于最简单的if-else条件代码也会给出错误的去混淆(它们在第一行显示一个return;的while(true)循环。 有没有其他免费软件应用程序做同样的去混淆工作? 也许还可以使用proguard的映射文件?

Linkedin Android SDK – 无法连接到API(INVALID_REQUEST)

我在连接到Linkedin API时遇到了一些麻烦。 我正在关注这个https://developer.linkedin.com/docs/android-sdk和这个https://developer.linkedin.com/docs/android-sdk-auth ,但我收到此错误代码: { “errorCode”: “INVALID_REQUEST”, “errorMessage”: “either bundle id or package name \/ hash are invalid, unknown, malformed” } 到目前为止,我的实现非常简单: public void shareOnLinkedin() { AuthListener authListener = new AuthListener() { @Override public void onAuthSuccess() { Log.d(TAG, “Success”); } @Override public void onAuthError(LIAuthError error) { Log.d(TAG, error.toString()); } }; LISessionManager .getInstance(getApplicationContext()) .init(ColectionDetailActivity.this, buildScope(), authListener, […]