2012-01-29 5 views
23

colegas, tengo la dicha pregunta: 1. En mi primera clase tengo elerror "Ningún caso de que encierra tipo", mientras que la llamada al método de otra clase en Android

public class parseYouTubeAndYahoo extends AsyncTask<String, Void, List<VideoDataDescription>> 

para analizar los datos de Internet. Pero necesito llamar al método execute() de esta clase desde otra clase. Al tratar de corregir dicho código:

new MainActivity.parseYouTubeAndYahoo().execute("someURL"); 

Tengo el siguiente mensaje de error desde Eclipse

Ningún caso de que encierra tipo MainActivity es accesible. Debe calificar la asignación con una instancia adjunta de tipo MainActivity (por ejemplo, x.new A() donde x es una instancia de MainActivity).

y realmente este problema está envuelto en la niebla para mí. Entonces, ¿cómo llamar a este método desde otra clase?

Respuesta

54

En términos del error real aquí, si la clase parseYouTubeAndYahoo es una clase interna no estática dentro de su actividad, entonces necesita una instancia de la clase adjunta para crear una instancia de la clase interna. Por lo tanto, se necesita:

MainActivity myActivity = new MainActivity(); 
MainActivity.parseYouTubeAndYahoo asyncTask = myActivity.new parseYouTubeAndYahoo(); 

Sin embargo ....

Realmente no se debe crear instancias de clases internas no estáticos de sus actividades desde fuera del Activity porque a fin de crear una instancia de un no -estática clase de innner, tienes que crear una instancia de la clase adjunta, que, en este caso, es la actividad. Las actividades deben iniciarse, no crearse una instancia a través del new. Si tiene un AsyncTask que le gustaría usar en diferentes lugares, cree una nueva clase de nivel superior que se extienda desde AsyncTask.

(Para un ejemplo de creación reutilizables AsyncTasks, consulte: https://github.com/levinotik/ReusableAsyncTask)

Tenga en cuenta que la sintaxis que se ha tratado de utilizar funcionaría si necesita tomar una clase anidada estática. Esto se debe a que en ese caso, la clase externa realmente solo está actuando como un espacio de nombres, pero la clase anidada, porque es estática, en realidad no necesita una referencia a una instancia de la clase externa. Por lo tanto:

OuterClass.StaticNestedClass nestedObject = 
    new OuterClass.StaticNestedClass(); 

es la sintaxis correcta para obtener una instancia de una clase anidada estática.

+0

Muy completa respuesta - ¡muchas gracias! –

1

Referencia el contexto de la actividad a otra clase y úsala.

Al igual que: oneofconstructer pública (ctx Contexto, .....)

3

supongo que su clase parseYouTubeAndYahoo es una clase interna en la clase MainActivity, en Java, debe instaniate un objeto de la clase interna por new MainActivity().new parseYouTubeAndYahoo() , por lo que llama método como este new MainActivity().new parseYouTubeAndYahoo().execute("someURL");

también supongo MainActivity extiende la clase Activity, así que creo que la respuesta debe ser this.new parseYouTubeAndYahoo().execute("someURL"); cuando se acaba de llamar a este método dentro de la clase MainActivity.

3

Sería más fácil simplemente colocar AsuncTask en otro archivo como una clase separada.

Pero si realmente quiere tener es una clase interna, entonces o bien tiene que ser estática o si necesita obtener una referencia a su clase padre en primer lugar, que podría hacerse así:

en onCreate de MainActivity:

estática MainActivity activityInstance = getContext();

nuevo método en MainActivity:

public static MainActivity getActivityInstance(){ 
    return activityInstance; 
} 

Luego, en otra actividad que se pueda obtener la instancia y acceder a sus métodos públicos

MainActivity instanceOfMainActivity = MainActivity.getInstance();

Entonces

nueva instanceOfMainActivity.parseYouTubeAndYahoo() ejecutar ("someURL.");

Cuestiones relacionadas