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