2016-07-22 17 views
0

私は最初のアプリケーションで作業していて、ある時点で立ち往生しています。 私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コンストラクタを呼び出す前にビューをいくつかの待機画面に変更することはできません。また、作業を無効にすることも作業を無効にすることも、新しいレイアウトでsetContentViewを実行することもできません。 setTextでビューを変更しても何も表示されません。リストにデータが入力されている場合にのみ、すべてのビューの変更が表示されます。

コンストラクタがListofAudioFilesを呼び出す前に、自分のプログラム構造を完全に変更することなく、どのようにしてonClick(...)でビューの変更を行うことができますか?

+0

/必ずAsyncTaskや作業者にあなたの操作をプッシュする別の方法を使用してください糸。 – vkislicins

+0

これは便利です:https://www.youtube.com/watch?v=0Z5MZ0jL2BM&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=2 – vkislicins

答えて

0

UIスレッドでコンストラクタを実行しているため、ビューを待機画面のように変更することはできません。

ビューを消したり、テキストを変更するなど、UI関連のすべてのことが既に想定されているかもしれません。時間がかかるコンストラクタを呼び出すと、コンストラクタはUIスレッドで実際に実行されます。これは、UIスレッドがあなたのオーディオファイルをロード中であることを意味しています(これは実行されていません)。 UIを更新するにはどうすればいいですか?

結果として、UIスレッドは、時間のかかる操作が完了するまでUIの更新を停止します。ユーザーには、これはアプリがフリーズしたように見えます。

あなたは何をすることができますか? AsyncTaskサブクラスまたは新しいThreadオブジェクトを作成することができます。前者が推奨されます。

AsyncTaskonPostExecuteメソッドは、オーディオファイルのロードが完了すると呼び出されます。操作が終了したことを知るには、そのメソッドをオーバーライドするだけです!

あなたはここにAsyncTaskについての詳細を学ぶことができます:あなたはUIスレッド上で、あなたの長時間実行メソッドを実行しているので、https://developer.android.com/reference/android/os/AsyncTask.htmlおそらくです

関連する問題