将视图修改为等待屏幕

时间:2016-07-22 10:05:30

标签: android view

我正在制作我的第一个应用程序,并且卡在某些方面。 在我的MainActivity中有一个onClick方法,它是链接的 到主布局文件中的按钮:

    <Button
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/IncludeAlbum"
    android:text="@string/scan"
    android:onClick="onClick"
    />

这是onClick:

    public void onClick(View view){

    view.setVisibility(view.GONE);

    View v1 = (View) findViewById(id.Welcomemessage);
    v1.setVisibility(v1.GONE);

    //
    // ... many more visibility changes
    //

    loaf = new ListOfAudioFiles();  // TAKES TIME

    ListView lv = (ListView) findViewById(id.listView1);
    adapter = new CustomAdapter(this, allComparisons); //loaf.songinfos

    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                                long id) {
            ListView lv = (ListView) findViewById(R.id.listView1);

            long viewId = view.getId();

            if (viewId == R.id.textView1) {
                allComparisons.get(position).togglecb1();
                adapter.notifyDataSetChanged();
            } else {
                allComparisons.get(position).togglecb2();
                adapter.notifyDataSetChanged();
            }

        }
    });

}

不是很干净,我知道,但我想保留结构。 listofaudiofiles构造函数耗费了大量时间。

我的问题是,在调用listofaudiofiles构造函数之前,我无法将视图更改为某个等待屏幕,(post)也无法使工作无效,也不能在新布局上执行setContentView。通过setText修改视图也不会提供任何内容。只有在填充列表时,才会显示所有视图更改。

如何在构造函数调用ListofAudioFiles之前在onClick(...)中实现视图更改,而不完全改变我的程序结构?

1 个答案:

答案 0 :(得分:0)

您无法将视图更改为等待屏幕,因为您正在 UI线程上运行构造函数。

您可能已经猜到了,所有与UI相关的内容都在UI线程上完成,包括使视图消失,更改文本等。当您调用耗时的构造函数时,构造函数实际上是在UI线程上执行的。这意味着UI线程正忙于加载您的音频文件(它不应该这样做)。它怎么可能更新UI(它本应该做什么)?

结果,UI线程停止更新UI,直到完成耗时的操作。对于用户来说,这似乎已经冻结了应用程序。

那你能做什么?您可以创建AsyncTask子类,也可以创建新的Thread对象。建议使用前者。

完成加载音频文件后,将调用onPostExecute中的AsyncTask方法。您只需要覆盖该方法即可知道操作何时完成!

您可以在此处详细了解AsyncTaskhttps://developer.android.com/reference/android/os/AsyncTask.html