首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免一些自定义视图冻结UI线程?

如何避免一些自定义视图冻结UI线程?
EN

Stack Overflow用户
提问于 2015-09-15 18:08:25
回答 2查看 1.3K关注 0票数 0

我在我的一个游戏窗口中有9个自定义视图(扩展每个视图类),导致我的UI线程冻结,当我按下“播放”按钮时,应用程序冻结(当在"onCreateView“中膨胀布局时,我正在使用碎片),直到游戏窗口生成,这是非常非常丑陋的事情。

我试着在一个单独的线程中做这件事,但是所有的都是问题,Android不允许我在主(UI)线程之外创建新的视图。

我试了那么多东西,但是我不能得到它,谁能告诉我如何实现这个目标?非常感谢

EN

回答 2

Stack Overflow用户

发布于 2015-09-15 18:53:58

对于cpu密集型绘图,您可以使用。

http://developer.android.com/reference/android/view/SurfaceView.html

此类的用途之一是提供一个辅助线程可以呈现到屏幕上的图面。

票数 0
EN

Stack Overflow用户

发布于 2015-09-16 17:37:10

我通过手动扩展AsyncTask中的布局解决了这个问题。我从显示“加载”视图的“播放窗口”调用AsyncTask,并在"onPostExecute“中创建”游戏窗口“(片段)并替换它。

一些虚拟代码(PlayFragment是GameFragment的上一个屏幕):

“播放按钮点击”(PlayFragment):

代码语言:javascript
复制
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_play:
            Bundle bundle = new Bundle();
            bundle.putSerializable(ARG_SELECTED_GAME, selectedGame);
            rlLoadingGame.setVisibility(View.VISIBLE);
            GameFragment gameFragment = GameFragment.newInstance(selectedGame);
            gameFragment.loadGame(activity, bundle);
            break;
    }
}

loadGame方法(GameFragment):

代码语言:javascript
复制
public void loadGame(Activity activity, Bundle bundle) {
    this.activity = activity;
    if (bundle != null) {
        currentGame = (Game) bundle.getSerializable(ARG_SELECTED_GAME);
    }
    new GenerateGame(bundle).execute();
}

GenerateGame AsyncTask (GameFragment):

代码语言:javascript
复制
class GenerateGame extends AsyncTask<Void, Void>, View> {
    private Bundle bundle;

    public GenerateGame(Bundle bundle) {
        this.bundle = bundle;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // do your stuff
    }

    @Override
    protected View doInBackground(Void... params) {
        View child = activity.getLayoutInflater().inflate(R.layout.game_fragment_layout, null);
        // do all your heavy load stuff
        return child;
    }

    @Override
    protected void onPostExecute(View layout) {
        super.onPostExecute(layout);
        // initialize and set all UI elements
        replaceFragment(layout, bundle);
    }
}

replaceFragment方法(GameFragment):

代码语言:javascript
复制
private void replaceFragment(View newView, Bundle bundle) {
    fragmentLayout = newView;
    // call to fragment manager replace/add or required method passing this as Fragment to replace and the bundle if needed
}

onCreateView (GameFragment):

代码语言:javascript
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (fragmentLayout != null) {
        return fragmentLayout;
    } else {
        return null;
    }
}

这是第一种方法,所以它可以被重构,很多事情都可以用更好的方式完成,但这取决于你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32583291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档