【问题标题】:AsyncTaskLoader slows down fragment tabs transition (Skipped frames)AsyncTaskLoader 减慢片段标签转换(跳过帧)
【发布时间】:2018-01-05 16:07:03
【问题描述】:

由于某种原因,我的标签转换不顺畅。我在两个单独的片段(1 和 2)中编写了两个单独的 AsyntTaskLoader,以从 WEB API 读取数据(点击按钮)。

在第二个片段中加载数据后,转到前一个选项卡的速度很慢(反之亦然)。但是当 Loader 被销毁时,过渡是平滑的。

公共类 Fragment1 扩展 Fragment 实现 LoaderManager.LoaderCallbacks {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if(getLoaderManager().getLoader(0)!=null){
        getLoaderManager().initLoader(0,null,this);
    }

     Submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
             if(some condition) {

            }

            else{
                stopLoader();
            }
        }
    });

}

@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
    return new GetDataFromLoader1(getContext(), args.getString("String"));
}

@Override
public void onLoadFinished(Loader<String> loader, String data) {
    try {
        //Read parsed JSON object from LoadInBackground

    }catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onLoaderReset(Loader<String> loader) {       
}


 void stopLoader() {
    getLoaderManager().destroyLoader(0);       
}}

编舞:跳过了 31 帧!应用程序可能在其主线程上做了太多工作。在“MyBitmap = obj.getBitmap();”中阅读这一行时在 JSON 对象中

【问题讨论】:

    标签: android android-fragments asynctaskloader


    【解决方案1】:

    加载器将所有繁重的工作卸载到后台线程,这很好,并且不会导致您的应用 UI 出现故障。

    但是,我怀疑是因为您的加载器只加载字符串 JSON 并且您在主线程上对其进行解析,这会导致您的 UI 丢帧或变得不流畅。

    尝试返回从加载器解析的模型,而不是解析 onLoadFinished 中的结果。并在loadInBackground中进行加载和解析

    【讨论】:

    • 我发现了问题所在,它在 logcat 中抛出了这条消息“Choreographer: Skipped 31 frames!该应用程序可能在其主线程上做了太多工作。”这意味着我需要将加载程序与主线程分开?知道如何在 OnLoadFinished 内设置ImageBitmap 而不会重载主线程。
    • 跳帧意味着您正在做的事情在主线程上花费的时间太长,导致它无法完成工作(绘制 UI)考虑在该类中显示更多代码以帮助确定在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多