La méthode findViewById(int) n'est pas défini
Je suis nouveau sur Android, le développement et la je suis en train de coder une petite application qui me permet de prendre un externe fichier JSON et l'analyser. J'ai eu ce travail, cependant, il ne marchera pas si j'essaie de l'exécuter en arrière-plan comme un AsyncTask
. Eclipse me donne l'erreur
La méthode findViewById(int) n'est pas défini pour le type LongOperation
dans cette ligne:
TextView txtView1 = (TextView)findViewById(R. id.TextView01);
Voici mon code:
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new LongOperation().execute();
}
}
class LongOperation extends AsyncTask<String, Void, String> {
private final Context LongOperation = null;
@Override
protected String doInBackground(String... params) {
try {
URL json = new URL("http://www.corps-marchia.de/jsontest.php");
URLConnection tc = json.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
JSONArray ja = new JSONArray(line);
JSONObject jo = (JSONObject) ja.get(0);
TextView txtView1 = (TextView)findViewById(R.id.TextView01);
txtView1.setText(jo.getString("text") + " - " + jo.getString("secondtest"));
}
} catch (MalformedURLException e) {
Toast.makeText(this.LongOperation, "Malformed URL Exception: " + e, Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(this.LongOperation, "IO Exception: " + e, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
Toast.makeText(this.LongOperation, "JSON Exception: " + e, Toast.LENGTH_LONG).show();
}
return null;
}
@Override
protected void onPostExecute(String result) {
}
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
ProgressDialog pd = new ProgressDialog(LongOperation);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("Working...");
pd.setIndeterminate(true);
pd.setCancelable(false);
}
}
Aucune idée sur comment résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
La mise en œuvre de
AsyncTask
dans l'une des autres réponses est erronée. La boîte de dialogue de progression est créé à chaque fois danspublishProgress
, et la référence à la boîte de dialogue n'est pas visible en dehors de la méthode. Voici ma tentative:LongOperation
est un membre de la classe, et a donc accès à l'instance qui l'enferme. Dans votre codeLongOperation
est un haut-niveau de la classe, de sorteMain.this
est hors de portée. Pour résoudre le problème, vous pouvez soit déplacerLongOperation
de sorte qu'il est un membre de la classe, ou de créer un constructeur deLongOperation
qui accepte unContext
. Ensuite, vous devez utilisernew LongOperation(this).execute();
pour le coup d'envoi de la tâche.Voici ce que vous devez faire pour le faire fonctionner comme vous le souhaitez. Utilisation onPostExecude()
Que vous essayez de faire quelque chose qui ne fonctionne pas. Tout d'abord, vous êtes à l'intérieur d'une classe qui étend la classe
AsyncTask
de sorte que vous n'aurez pas cette méthode car il est une méthode de la classeActivity
.Le deuxième problème, c'est que vous essayez de faire des éléments d'INTERFACE utilisateur dans une méthode qui n'est pas synchronisé avec le thread d'INTERFACE utilisateur. Ce n'est rien pour le faire.
Processus de votre réponse JSON dans le
doInBackground
méthode et de transmettre le résultat à l'onPostExecute
méthode où vous serez en mesure de gérer des éléments d'INTERFACE utilisateur qu'il est synchronisé avec le thread d'INTERFACE utilisateur.La configuration actuelle, vous avez va pas le rendre plus facile pour vous de gérer ce que vous essayez de le faire de toute façon. Vous pourriez faire votre
LongOperation
classe une classe privée de votreActivity
de classe et de définir lesTextView
en tant que membre de l'instance. Attraper hors de la mise en page à l'aide defindViewById
à l'intérieur de votreOnCreate
et de le modifier (texte ou autre) à l'intérieur de laonPostExecute
méthode de votreAsyncTask
.J'espère que c'est assez clair ce que je voulais dire.
findViewById est la méthode dans la classe d'Activité. Vous devriez passer en instance de votre activité à votre LongOperation lorsque vous le créez. Puis utiliser cette instance pour appeler findViewById.
Activity
classe quelque part est très dangereux si vous ne savez pas ce que vous faites, vous pourriez fuite de l'ensemble de l'activité!