我正在制作我的第一个应用程序,并且卡在某些方面。 在我的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(...)中实现视图更改,而不完全改变我的程序结构?
答案 0 :(得分:0)
您无法将视图更改为等待屏幕,因为您正在 UI线程上运行构造函数。
您可能已经猜到了,所有与UI相关的内容都在UI线程上完成,包括使视图消失,更改文本等。当您调用耗时的构造函数时,构造函数实际上是在UI线程上执行的。这意味着UI线程正忙于加载您的音频文件(它不应该这样做)。它怎么可能更新UI(它本应该做什么)?
结果,UI线程停止更新UI,直到完成耗时的操作。对于用户来说,这似乎已经冻结了应用程序。
那你能做什么?您可以创建AsyncTask
子类,也可以创建新的Thread
对象。建议使用前者。
完成加载音频文件后,将调用onPostExecute
中的AsyncTask
方法。您只需要覆盖该方法即可知道操作何时完成!
您可以在此处详细了解AsyncTask
:https://developer.android.com/reference/android/os/AsyncTask.html