为什么要将MediaPlayer API声明为全局实例变量?

时间:2018-02-22 15:35:22

标签: java android

public class MainActivity extends AppCompatActivity {     
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button play = (Button)findViewById(R.id.playButton);
        MediaPlayer mediaN = MediaPlayer.create(this, R.raw.master6);
        play.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                mediaN.start();
            }
        });
    }
}

在上面的代码中,我在MediaPlayer方法中初始化了一个新的onCreate对象。当我想使用MediaPlayer对象mediaN来调用start()方法时,它会要求我将对象声明为final。但是,如果我将MediaPlayer对象初始化为类MainActivity的实例变量,则不会出现任何错误。当MediaPlayer对象被声明为final方法的局部变量时,为什么要求将onCreate对象设为 { 'accession_id' => 'NC_000017.10', 'is_no_call' => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' ), 'end' => 12344, 'alternate_ids' => [], 'variants' => [ { 'dosage' => '2', 'accession_id' => 'NC_000017.10', 'is_no_call' => $VAR1->[0]{'is_no_call'}, 'end' => 12344, 'allele' => 'A', 'platform_labels' => [ 'ILMN_CUSTOMv4', 'ILMN_OMNIEXv3_CUSTOMv3' ], 'is_assayed' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ), 'start' => 12343 }, { 'dosage' => '0', 'accession_id' => 'NC_000017.10', 'is_no_call' => $VAR1->[0]{'is_no_call'}, 'end' => 12344, 'allele' => 'C', 'platform_labels' => [ 'ILMN_CUSTOMv4', 'ILMN_OMNIEXv3_CUSTOMv3' ], 'is_assayed' => $VAR1->[0]{'variants'}[0]{'is_assayed'}, 'start' => 12343 } ], 'id' => 'rs6565703', 'is_genotyped' => $VAR1->[0]{'variants'}[0]{'is_assayed'}, 'is_assayed' => $VAR1->[0]{'variants'}[0]{'is_assayed'}, 'gene_names' => [ 'DOC2B' ], 'start' => 12343 }

1 个答案:

答案 0 :(得分:0)

本地类可以绝对引用实例变量。他们无法引用非最终局部变量的原因是因为本地类实例可以在方法返回后保留在内存中。当方法返回时,局部变量超出范围,因此需要它们的副本。如果变量不是最终的,那么方法中变量的副本可能会发生变化,而本地类中的副本则没有变化,因此它们将不同步。 “Java和最终变量中的匿名类”https://medium.com/@emerino/anonymous-classes-in-java-and-final-variables-1b1830ac480b 这应该有所帮助。