编写android代码时这个处理程序有什么用?

时间:2013-05-31 06:36:02

标签: java android object this handler

这里在下面的代码中创建了songsManager对象,然后为什么this.songsList用于存储歌曲文件,为什么不使用songsList。主要问题是它的用途是什么,它究竟是什么以及何时使用? 我的主要疑问是,因为没有声明其他songsList所以没有songList冲突的机会所以为什么要特别将它称为当前类中声明的songsList。主要是我在有一个参数传递给一个函数时使用它,该函数的名字与在类中声明的对象或变量的名称相同,这样可以避免混淆并告诉编译器我想要使用在该类中声明的对象而不是作为一个参数传递我使用了..如果我错了请纠正我,并加入我对此的了解。

感兴趣的代码行后跟// 请看看它

public class CustomizedListView extends Activity{

private int currentIndex;
private String[] menuItems = {"Play","Share Music Via","Details"};
private LinkedList<File> songsList = new LinkedList<File>();//
private ArrayList<HashMap<String, String>> songsListdata = new ArrayList<HashMap<String, String>>();
private MediaMetadataRetriever mmr = new MediaMetadataRetriever();
private Utilities utils=new Utilities();
ListView list=null;
ModifiedAdapter adapter=null;
SongsManager plm=null;//
Button search;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playlist);

    plm = new SongsManager();//
    File extStore = Environment.getExternalStorageDirectory();
    // get all songs from sdcard
    this.songsList = plm.getFilesInFolder(extStore);//
    for (int i = 0; i < songsList.size(); i++) {
        // creating new HashMap
        HashMap<String, String> song = new HashMap<String, String>();
        mmr.setDataSource(songsList.get(i).getAbsolutePath().toString());

        //getting artist
        String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST);
        if(artist==null)
            artist=mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);

        //getting Duration
        String len = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

        long Len=0;
        try
        {
            Len=Integer.parseInt(len);
        }
        catch(Exception e)
        {
            Log.i(null, ":conversion error");
        }
        len=utils.milliSecondsToTimer(Len);
        Log.i(null, "length"+len);
        song.put("songTitle", (songsList.get(i)).getName().substring(0, ((songsList.get(i)).getName().length() - 4)));
        song.put("songArtist", artist);
        song.put("duration", len);
        song.put("songPath",songsList.get(i).getAbsolutePath().toString());
        // adding HashList to ArrayList
        songsListdata.add(song);
    }

    list=(ListView)findViewById(R.id.list);
    // Getting adapter by passing xml data ArrayList
    adapter=new ModifiedAdapter(this, songsListdata);
    list.setAdapter(adapter);
    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                final int position, long id) {

            final String songPath =songsList.get(position).getAbsolutePath().toString();
            AlertDialog.Builder builder = new AlertDialog.Builder(CustomizedListView.this);
            builder.setTitle((songsList.get(position)).getName().substring(0, ((songsList.get(position)).getName().length() - 4)));
            builder.setItems(menuItems, new DialogInterface.OnClickListener()
             {

                    public void onClick(DialogInterface dialog, int item)
                    {  

                        if(item==0)
                        {
                            Intent in = new Intent(getApplicationContext(),MainActivity.class);
                            // Sending songIndex to PlayerActivity
                            in.putExtra("songIndex", position);
                            setResult(100, in);
                            // Closing PlayListView
                            finish();
                        }
                        else if(item==2)
                        {
                            Intent details = new Intent(getApplicationContext(),Details.class);
                            details.putExtra("songPath", songPath);
                            startActivity(details);
                        }
                        else if(item==1)
                        {
                            Intent intent = new Intent();  
                            intent.setAction(Intent.ACTION_SEND);  
                            intent.setType("audio/*");
                            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(songPath)));
                            startActivity(intent);
                        }
                    }
             });
            AlertDialog alert = builder.create();
            alert.show();
        }
    });

    //Search for a song implementations
    search=(Button)findViewById(R.id.searchForSong);
    search.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent launchBrowser=new Intent(getApplicationContext(), Browser.class);
            startActivity(launchBrowser);
        }
    });
}

}

2 个答案:

答案 0 :(得分:1)

此关键字用于引用当前对象

因此,您可以使用this.member访问当前对象的任何成员。在您的示例中,您在当前对象中访问songList,因此使用它和不使用它之间没有区别。

更多地使用此关键字

正如您提到的以下示例

private int a;
void method(int a){
    this.a = a;
}

这里用于指代当前对象的成员,因为名称相同。如果你用过

void method(int b){
    a = b;
}

然后使用它和不使用此

之间没有区别

更多示例

private int a = 5;

public void method() {
    int a = 6;
    System.out.println(a); // will print 6 
    System.out.println(this.a);  // will print 5
}

在下面的示例中,第二个指向当前对象的成员变量,因此它正在打印5。

答案 1 :(得分:1)

实际上,这个答案应该分几步完成

1

此操作员

它将引用当前使用它的对象/范围

例如: 说按钮监听器是这样的

new button(context).setOnClickListener(new View.onClickListener(public void onClick(View v){ //在此处使用此引用此onclicklistener

});

//用于构造函数

public classname(int arg1){ //所以用这个arg1初始化你的类的arg1

//只是为了你写的.clarity this.arg1 = ARG1;

}

2

这里使用的歌曲列表是多余的,没有任何意义,因为它没有冲突。

希望这会对你有所帮助。