Список активности занимает время, чтобы открыть с черным экраном
Я пытаюсь открыть список песен после нажатия кнопки в активности, которая запускает композицию songlist.java. Однако после нажатия кнопки "btsonglist" появляется черный экран, и каждый раз для открытия списка требуется время. Также есть ли способ, который список загружается в фоновом режиме и просто отображается после нажатия кнопки. MainActivity.java
public class MainActivity extends Activity implements
View.OnClickListener{
Button playbutton, forwardbutton, backwardbutton,songlistbutton;
ImageView iv;
Bitmap bmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView)findViewById(R.id.imageView);
InputStream is = getResources().openRawResource(R.raw.background);
bmp = BitmapFactory.decodeStream(is);
iv.setImageBitmap(bmp);
initiate();
}
public void initiate(){
playbutton = (Button)findViewById(R.id.btplay);
forwardbutton = (Button)findViewById(R.id.btforward);
backwardbutton = (Button)findViewById(R.id.btbackward);
songlistbutton = (Button)findViewById(R.id.btsonglist);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btplay:
break;
case R.id.btforward:
break;
case R.id.btbackward:
break;
case R.id.btsonglist:
AsyncTask1 AsyncTask_obj = new AsyncTask1();
AsyncTask_obj.execute();
}
}
private class AsyncTask1 extends AsyncTask<String,String,String>{
ProgressDialog progressDialog;
@Override
protected String doInBackground(String... strings) {
try {
Class ourclass = Class.forName("com.example.musicchatv10.songlist");
Intent songlistint = new Intent(getApplicationContext(),ourclass);
startActivityForResult(songlistint, 100);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
}
Это songlist.java
public class songlist extends Activity{
ArrayList<String> arrayList;
ListView listView;
ArrayAdapter<String> adapter;
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song_item);
listView = (ListView)findViewById(R.id.list);
arrayList = new ArrayList<>();
dostuff();
}
@Override
protected void onPause() {
super.onPause();
}
public void dostuff(){
final ArrayList<File> mysongs;
mysongs = findsongs(Environment.getExternalStorageDirectory());
for(int j=0; j<mysongs.size();j++){
//Toast.makeText(getApplicationContext(),"Loading Files Please wait",Toast.LENGTH_LONG ).show();
arrayList.add(j,mysongs.get(j).getName().toString());
}
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (mediaPlayer !=null){
mediaPlayer.release();
}
else{
//int resID = getResources().getIdentifier(arrayList.get(i),"raw",getPackageName());
Uri uri = Uri.fromFile(mysongs.get(i));
mediaPlayer = MediaPlayer.create(getApplicationContext(),uri );
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.start();
}
else{
mediaPlayer.start();
}
}
}
});
}
public ArrayList<File> findsongs (File root){
ArrayList<File> al = new ArrayList<File>();
File[] files = root.listFiles();
for (File singlefile: files){
if (singlefile.isDirectory() && !singlefile.isHidden()){
al.addAll((findsongs(singlefile)));
}
else {
if(singlefile.getName().endsWith(".mp3")){
al.add(singlefile);
}
}
}return al;
}
}
4 ответа
Запуск намерения списка песен из MainActivity в фоновом потоке с помощью AsyncTask не требуется. Вместо этого вы должны сделать плавную загрузку, добавив неопределенный индикатор выполнения в свой макет списка песен и в onCreate
в списке песен показать индикатор выполнения и скрыть другие виды. Затем запустите AsyncTask, который выполняет ваши dostuff
рутина в фоновом режиме. Когда это будет сделано (в onPostExecute
) затем вы можете скрыть индикатор выполнения и показать обычные представления.
Как это:
//songlist
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.song_item);
listView = (ListView)findViewById(R.id.list);
listView.setVisibility(View.INVISIBLE);
new DoStuffTask(this).execute();
}
private static class DoStuffTask extends AsyncTask<String,String,String>{
private WeakReference<songlist> context;
private WeakReference<ProgressBar> prog;
private WeakReference<ListView> lv;
DoStuffTask(songlist c) {
this.context = new WeakReference<>(c);
this.prog = new WeakReference<>((ProgressBar)c.findViewById(R.id.list_progress));
this.lv = new WeakReference<>((ListView)c.findViewById(R.id.list));
}
@Override
protected void onPreExecute() {
ProgressBar p = prog.get();
if( p != null ) {
p.setVisibility(View.VISIBLE);
}
}
@Override
protected String doInBackground(String... strings) {
songlist a = context.get();
if( a != null ) {
// You may need to have this routine just generate the adapter,
// (store it in the activity) then actually set the adapter
// on the ListView in onPostExecute
a.dostuff();
}
return null;
}
@Override
protected void onPostExecute(String s) {
ProgressBar p = prog.get();
ListView l = lv.get();
if( p != null && sl!= null ) {
p.setVisibility(View.INVISIBLE);
l.setVisibility(View.VISIBLE);
}
}
}
Создайте Asyntask
внутри songlistActivity
Переместить ваш findsongs()
код и arrayList.add(...
цикл внутри асинхронных doInBackground
и установить список для adpater внутри onPostExecute
,
Переместить doStuff
способ отделить нить, особенно ваш findsongs
метод, который делает работу с IO и обратите внимание, что вы должны вызывать listView.setAdapter(adapter);
в основной теме
Создание bitmap
занимает время и влияет на создание деятельности. Лучше сделать это с onResume
или же AsyncTask
,