列表活动需要时间才能打开黑屏

时间:2018-07-21 11:58:35

标签: android listactivity audio-player android-music-player

在尝试启动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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

func createBtn(action:String) -> UIButton { let btn:UIButton = UIButton(type: .system) btn.addTarget(self, action: Selector(action), for: .touchUpInside) return btn } @objc func buttonTouched(_ sender:UIButton) {//The _ char is imp Swift.print("buttonTouched") } let btn = createButton(action:"buttonTouched:")//The : char is imp 内创建Asyntask,将songlistActivity代码和findsongs()循环移到异步arrayList.add(...内,并在doInBackground内将列表设置为adpater。 / p>

答案 2 :(得分:0)

创建bitmap会花费时间,并且会影响创建活动。 最好使用onResumeAsyncTask来做到这一点。

答案 3 :(得分:0)

移动您的doStuff方法以分离线程,尤其是与io一起工作的findsongs方法,并注意您应在主线程上调用listView.setAdapter(adapter);