2013-03-19 32 views
0

我建立一个报警程序。该应用程序的一部分扫描一次一个按钮被点击的装置的内部和外部存储器中,然后在系统中显示一个ListView显示所有的音频文件。代码的相关部分如下:ListActivity到永远,应用程序提供了一个空白的屏幕

UpdateTime.java: 

public class UpdateTime extends Activity { 

    Intent changeSound; 
    Button alarmSound; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.update_time); 

     alarmSound = (Button)findViewById(R.id.alarmSound); 
     alarmSound.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 

       changeSound = new Intent (UpdateTime.this, SelectAudio.class); 
       startActivityForResult(changeSound, 1);   
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.update_time, menu); 
     return true; 
    } 
} 

在此可以找到音频文件的类,然后将其显示在ListActivity。我已经检查这个类别的地方的listData()方法,并且它工作得很好,所以你可以跳过读的那部分,如果你想。

SelectAudio.class: 

public class SelectAudio extends ListActivity { 

    public static final int selectAudioInteger = 2; 

    Intent incomingIntent; 
    String fileName []; 
    String fileTitle []; 
    String names = ""; 
    String titles = ""; 

    ContentResolver myResolver; 
    Cursor myCursor; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     myResolver = this.getContentResolver(); 
     incomingIntent = getIntent(); 
     listData(); 
     fileName = names.split("\n"); 
     fileTitle = titles.split("\n"); 

     setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, fileTitle)); 

    } 


    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 
     String str = fileName[position]; 
     incomingIntent.putExtra("fileTitle", str); 
     setResult(selectAudioInteger, incomingIntent); 
     Toast toast = Toast.makeText(getApplicationContext(), fileTitle[position] + " selected" , Toast.LENGTH_SHORT); 
     toast.show(); 
     finish(); 
    } 

    void listData() 
    { 
     Uri uriInternal = android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI; 
     Uri uriExternal = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

     Cursor curExternal = myResolver.query(uriExternal, null, MediaStore.Audio.Media.IS_MUSIC, null, null); 
     Cursor curInternal = myResolver.query(uriInternal, null, MediaStore.Audio.Media.IS_MUSIC, null, null); 

     int iTitleExternal = curExternal.getColumnIndex(MediaStore.Audio.Media.TITLE); 
     int iTitleInternal = curInternal.getColumnIndex(MediaStore.Audio.Media.TITLE); 

     int iNameExternal = curExternal.getColumnIndex(MediaStore.Audio.Media.DATA); 
     int iNameInternal = curExternal.getColumnIndex(MediaStore.Audio.Media.DATA); 

     while(!curExternal.moveToLast()) 
     { 
      names = names + curExternal.getString(iNameExternal) + "\n"; 
      titles = titles + curExternal.getString(iTitleExternal) + "\n"; 
      curExternal.moveToNext(); 
     } 

     while (!curInternal.moveToLast()) 
     { 
      names = names + curInternal.getString(iNameInternal) + "\n"; 
      titles = titles + curInternal.getString(iTitleInternal) + "\n"; 
      curInternal.moveToLast(); 
     } 

    } 

} 

这段代码的问题是,一旦点击按钮时,屏幕变为空白,并在logcat中,我收到一条消息,其内容是这样的:

03-19 18:18:18.798: W/ActivityManager(59): Activity pause timeout for HistoryRecord{4a2a3d70 com.ikshvaku.intelligentalarm/.UpdateTime} 
03-19 18:18:21.854: I/ActivityManager(59): Displayed activity com.ikshvaku.intelligentalarm/.SelectAudio: 3053 ms (total 3053 ms) 
03-19 18:18:28.322: W/ActivityManager(59): Launch timeout has expired, giving up wake lock! 
03-19 18:18:28.855: W/ActivityManager(59): Activity idle timeout for HistoryRecord{4a12ce98 com.ikshvaku.intelligentalarm/.SelectAudio} 

我所知,解的问题与使用AsyncTask类有关。我只是无法找到如何解决这个问题。

任何人可以请帮助! 谢谢。

+0

问题出在'while(!curExternal.moveToLast())'这是什么意思? – Selvin 2013-03-19 12:57:22

+0

由于是查询,为什么不直接使用CursorAdapter呢?这里有很多例子。 – 2013-03-19 12:59:36

+0

@RajeshCP:我不明白你的问题?基本上我在单独的项目中单独的ListActivity上检查了整个代码。它在那里工作得很好。当我在这个项目中导入了相同的代码,并进行了一些修改后,我无法得到想要的结果。 – Rajat 2013-03-19 13:01:27

回答

0

当您的onCreate被称为该列表活动......你应该把装载视图,并打开进了异步任务,并获取你的数据......当数据最终完成加载..然后更新列表视图...这样用户知道你的应用程序没有被冻结或任何东西......这是我将如何做到这一点..假设你的其他代码完美工作!

public class SelectAudio extends ListActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     myResolver = this.getContentResolver(); 
     incomingIntent = getIntent(); 
     fileName = names.split("\n"); 
     fileTitle = titles.split("\n"); 

     setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, fileTitle)); 
     new GetDataFromDisk().execute(); 
    } 



    private class GetDataFromDisk extends AsyncTask<String, Void, String> { 

      @Override 
      protected String doInBackground(String... params) { 
      listData(); 
      return null; 
      }  

      @Override 
      protected void onPostExecute(String result) {    
      } 

      @Override 
      protected void onPreExecute() { 
      ArrayAdapter adapter = getListAdapter(); 
      adapter.notifyDataSetChanged(); 
      } 
    } 
} 
+0

这没有奏效。相同的空白页面。 – Rajat 2013-03-19 13:21:40

相关问题