Список активности занимает время, чтобы открыть с черным экраном

Я пытаюсь открыть список песен после нажатия кнопки в активности, которая запускает композицию 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,

Другие вопросы по тегам