处理方向变化的最佳实践:Android

处理方向变化的最佳实践:Android,android,multithreading,orientation,fragment,Android,Multithreading,Orientation,Fragment,我正在通过各种实践来处理线程和异步任务的方向变化。我遇到了以下解决方案: 附加分离模型:将活动附加和分离到线程和异步任务,同时保留其实例。(来源:,) 无头片段方式:使用非UI/无头片段执行所有与线程相关的操作,并在配置更改时保留其实例。(来源:,) 有没有其他方法来处理这种情况?推荐的做法是什么?我问这个是因为我在Android文档中找不到通用的解决方案 您可以尝试以下方法: 1) 如果您的应用程序不明确要求任何方向更改,只需在应用程序执行开始时禁用方向更改,这样您就可以避免与方向更改有关的任

我正在通过各种实践来处理线程和异步任务的方向变化。我遇到了以下解决方案:

  • 附加分离模型:将活动附加和分离到线程和异步任务,同时保留其实例。(来源:,)

  • 无头片段方式:使用非UI/无头片段执行所有与线程相关的操作,并在配置更改时保留其实例。(来源:,)


  • 有没有其他方法来处理这种情况?推荐的做法是什么?我问这个是因为我在Android文档中找不到通用的解决方案

    您可以尝试以下方法:

    1) 如果您的应用程序不明确要求任何方向更改,只需在应用程序执行开始时禁用方向更改,这样您就可以避免与方向更改有关的任何崩溃或相关问题

    您可以在布局xml文件的最外层布局中使用以下行执行此操作:

      android:orientation="vertical"
    
    (用于设置垂直方向)

    2) 您可以在线程执行开始时使用Asynctask设置或保留以前的方向值,如下所示(仅语法示例):


    除了异步任务之外,还有很多方法可以尝试。如果您试图找到最佳实践,AsyncTask不是一个好的选择。解释为什么不应使用AsyncTask。他们建议您使用更好的方法来处理长时间运行的任务
    我已经使用过这个库,我认为它值得尝试:尊重活动生命周期(方向更改),无内存泄漏,支持多线程,缓存结果。。。它可以通过使用缓存来插入和拔出长请求任务(但对于非缓存请求,它不能很好地工作)

    但我推荐一种来自谷歌的好方法:
    IntentService
    BroadcastReceiver
    。您将在方向更改期间注册和取消注册广播以接收数据结果。所有后台任务都将在IntentService中工作,并通过BroadcastReceiver通知您想要的任何活动。有很多例子可以尝试。大概是这样的:

    更新

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    

    嗨,R4j,关键是我的应用程序非常复杂。我必须做些什么 并行网络呼叫数。您使用IntentService的方法是 很好,但不适用于复杂场景

    我不认为这是个问题。你可以用IntentService做任何事情,甚至是复杂的任务。如果需要并行任务,可以考虑多线程的服务,并通过意图与活动进行通信。在服务和活动之间发送意图是安全和灵活的,这是Android的方式。
    如果您想缓存(通过文件下载、流媒体、数据库…)
    RoboSpice
    是您的最佳选择

    为什么不试试,尤其是
    AsyncTaskLoader
    ?它们可用于蜂窝状结构之前的整个生命周期,并与活动/片段生命周期完美匹配。以下是官方摘要:

    • 它们适用于所有活动和片段
    • 它们提供数据的异步加载
    • 他们监控数据的来源,并在内容发生变化时提供新的结果
    • 在配置更改后重新创建时,它们会自动重新连接到最后一个加载程序的光标。因此,他们不需要重新查询数据

    如果处理异步任务是您主要关心的问题,即不愿意在每次方向更改时下载数据,那么您可以这样尝试--

    (1) 在像这样创建之前初始化任何值

    Boolean android_hacker = false;
    
    (2) 现在,在AsyncTask类上下载完数据后,将该值设置为true

    android_hacker = true;
    
    这里使用模型和阵列适配器类维护所有数据

    (3) 现在每次方向改变,然后像这样检查

    if( android_hacker = true ){
    
    // Use your saved instance ..
    
    }else{
    
    // Download data as it is yet not downloaded ..
    
    }
    
    希望对您有所帮助。

    一些总结 上面提到的几种方法都是很好的实践,但我想我可以用简短的解释来总结它们。下面是目前用于http网络、异步工作/线程和缓存的一些最流行的库

    我当前的项目(只是偏好) 我个人目前正在使用奥托加载器截击奥姆莱特,以及基于Apache
    服务
    的网络堆栈。我确实希望在某个时候用截击改装,或者最终用机器人世界来替换网络堆栈

    我个人非常喜欢奥托和截击


    机器人空间(模块化)
    • 长时间运行任务的插件/模块化方法
    • 这就像是库中的“瑞士军刀”,但您需要知道每个工具的作用
    • 处理REST呼叫
    • 通过方向和其他更改保持数据
    • 可以处理磁盘和内存缓存)
    • 使用各种HTTP库和持久性库(Gson、Jackson、Spring和以下许多库)
    • 我想是beta版的支持
    改装(其余)
    • 注释库使REST变得非常简单。与机器人世界合作
    截击(网络数据和图像)
    • 这是运行Google Play商店的网络代码
    • 快速、可靠
    • 使用一些合理的默认值为您处理大多数缓存
    • 非常容易使用
    • 专为非常快速的图像、json等加载而构建
    • 为您处理所有线程
    毕加索(图像)
    • if( android_hacker = true ){ // Use your saved instance .. }else{ // Download data as it is yet not downloaded .. }