将视图修改为等待屏幕



我正在开发我的第一个应用程序,但在某些方面遇到了问题。在我的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();
            }
        }
    });
}

我知道不是很干净,但我想保留这个结构。audiofiles构造函数的列表做了很多耗时的事情。

我的问题是,在调用listofaudiofiles构造函数之前,我无法将视图更改为某个等待屏幕,既不能使工作无效,也不能在新布局上设置ContentView。通过setText修改视图也不会给出任何结果。只有在填充列表时,才会显示所有视图更改。

在构造函数调用音频文件列表之前,我如何在onClick(…)中实现视图更改,而不完全更改我的程序结构?

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

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

因此,UI线程停止更新UI,直到耗时的操作完成。对于用户来说,这看起来像是应用程序已经冻结。

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

AsyncTask中的onPostExecute方法将在加载完音频文件后调用。您只需要重写该方法就可以知道操作何时完成!

您可以在此处了解有关AsyncTask的更多信息:https://developer.android.com/reference/android/os/AsyncTask.html

最新更新