列表 activity 打开黑屏需要时间

List activity is taking time to open with a black screen

我正在尝试在 activity 中按下启动 songlist.java activity 的按钮后打开歌曲列表。但是按下按钮 '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;
        }

}

创建 bitmap 需要时间并影响创建 Activity。 最好使用 onResumeAsyncTask

将你的 doStuff 方法移动到单独的线程,尤其是你的 findsongs 方法,它正在与 io 一起工作,并注意你应该在主线程上调用 listView.setAdapter(adapter);

无需使用 AsyncTask 在后台线程上从 MainActivity 启动歌曲列表意图。为了使加载更顺畅,您应该做的是在歌曲列表布局中添加一个不确定的进度条,并在歌曲列表的 onCreate 中显示进度条并隐藏其他视图。然后启动在后台执行 dostuff 例程的 AsyncTask。完成后(在 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);
        }
    }
}

songlistActivity 内创建 Asyntask 移动您的 findsongs() 代码并在 asynctsks doInBackground 内循环 arrayList.add(... 并在 onPostExecute 内将列表设置为 adpater .