在尝试启动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;
}
}
答案 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
会花费时间,并且会影响创建活动。
最好使用onResume
或AsyncTask
来做到这一点。
答案 3 :(得分:0)
移动您的doStuff
方法以分离线程,尤其是与io一起工作的findsongs
方法,并注意您应在主线程上调用listView.setAdapter(adapter);