Java 在onCreate方法中使用线程调用函数可以吗?

Java 在onCreate方法中使用线程调用函数可以吗?,java,android,multithreading,performance,Java,Android,Multithreading,Performance,我用线程编写了一个函数,该函数创建字体,然后通过处理程序将这些字体分配给文本视图。我在onCreate方法中调用了这个函数。所以我想知道在onCreate方法中使用线程调用函数是否是一种好的编程实践。它会影响我的应用程序的性能吗 而且,我没有注意到使用这些线程在性能上有任何改进。这是我的密码: public class MainActivity extends Activity { TextView quickFactTitle, quickFactText, plioceneTitl

我用线程编写了一个函数,该函数创建字体,然后通过处理程序将这些字体分配给文本视图。我在onCreate方法中调用了这个函数。所以我想知道在onCreate方法中使用线程调用函数是否是一种好的编程实践。它会影响我的应用程序的性能吗

而且,我没有注意到使用这些线程在性能上有任何改进。这是我的密码:

public class MainActivity extends Activity {

    TextView quickFactTitle, quickFactText, plioceneTitle, plioceneMya,
            plioceneInfo, mioceneTitle, mioceneMya, mioceneInfo;

    Typeface font, nFont, ntFont;

    EditText searchBox;

    LinearLayout toPlioList;

    Intent i;

    Handler textFontHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            applyFonts();
            return true;
        }
    });

   /* Handler textFontHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            applyFonts();
        }
    };*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Initialize();
        i = new Intent(MainActivity.this, CreatureList.class);
        initFonts();
        // applyFonts();
    }

    public void openPlioList(View v) {
        i.putExtra("listType", 1);
        startActivity(i);
    }

    private void initFonts() {
        Runnable fontR = new Runnable() {
            @Override
            public void run() {
                font = Typeface.createFromAsset(getAssets(), "Fonts/futuristic.TTF");
                nFont = Typeface.createFromAsset(getAssets(), "Fonts/quicksand_book.otf");
                ntFont = Typeface.createFromAsset(getAssets(), "Fonts/quicksand_bold.otf");
                textFontHandler.sendEmptyMessage(0);
            }
        };
        Thread fontThread = new Thread(fontR);
        fontThread.start();
    }

    private void applyFonts() {
        quickFactTitle.setTypeface(font);
        plioceneTitle.setTypeface(ntFont);
        mioceneTitle.setTypeface(ntFont);
        quickFactText.setTypeface(nFont);
        plioceneInfo.setTypeface(nFont);
        mioceneInfo.setTypeface(nFont);
    }

    public void Initialize() {
        quickFactTitle = (TextView) findViewById(R.id.quick_fact_title);
        quickFactText = (TextView) findViewById(R.id.quick_fact_text);
        plioceneInfo = (TextView) findViewById(R.id.pliocene_info_txt);
        plioceneTitle = (TextView) findViewById(R.id.pliocene_title_txt);
        plioceneMya = (TextView) findViewById(R.id.pliocene_mya_txt);
        mioceneTitle = (TextView) findViewById(R.id.miocene_title_txt);
        mioceneInfo = (TextView) findViewById(R.id.miocene_info_txt);
        mioceneMya = (TextView) findViewById(R.id.miocene_mya_txt);

        searchBox = (EditText) findViewById(R.id.search_box);

        toPlioList = (LinearLayout) findViewById(R.id.to_plioList);
    }
}

首先,请注意,使用线程不会提高应用程序的总体速度。实际上,使用它们只会降低应用程序的速度。请注意,您应该尽可能少地创建线程数的应用程序

那么,它们什么时候有用?每当您想要执行I/O操作时,线程都很有用,这会在等待I/O操作完成时浪费CPU周期。I/O操作包括:

  • 文件I/O
  • 网络I/O
  • 等等
一句话:线程使用不当会降低应用程序的性能


在您的情况下,我不确定是否应该在后台线程中执行
createFromAsset
。正如我刚刚签出的,我没有看到任何关于背景线程


但是,如果您确定应该在后台线程中执行,那么您使用线程的方式在IMO中是可以的。

请显示一些代码。这是可以的,就像您添加了代码一样。IMO,线程也应该在其他情况下使用,而不仅仅是用于I/O。因为现代设备有多个cpu核,你可以充分利用线程的所有处理能力,例如,对于CPU密集型处理(例如位图解码),你可以同时执行多个操作,而不是必须按顺序执行,从而加快应用程序的速度。我同意asker对线程的使用有点可疑。