Die Methode findViewById(int) ist nicht definiert
Ich bin neu in der Android Entwicklung und ich bin versucht zu code eine kleine app, die ermöglicht es mir, zu schnappen eine externe JSON-Datei und analysieren es. Ich habe diese arbeiten, aber es wird nicht funktionieren, wenn ich versuche, führen Sie es im hintergrund als AsyncTask
. Eclipse gibt mir die Fehlermeldung
Die Methode findViewById(int) ist nicht definiert für den Typ LongOperation
in dieser Zeile:
TextView txtView1 = (TextView)findViewById(R. id.TextView01);
Hier ist mein 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);
}
}
Irgendwelche Ideen auf, wie man dieses Problem beheben?
InformationsquelleAutor robs | 2011-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Umsetzung der
AsyncTask
in einer der anderen Antworten ist fehlerhaft. Der Fortschritts-dialog wird jedes mal erzeugt, wenn innerhalbpublishProgress
, und der Verweis auf den dialog nicht sichtbar außerhalb der Methode. Hier ist mein Versuch:Ah, haben Sie es als eine separate Klasse, die nur in derselben Java-Datei. In meinem Beispiel die
LongOperation
ist ein member - Klasse, und hat so Zugriff auf die Instanz, umschließt es. In Ihrem codeLongOperation
ist eine top-level Klasse, soMain.this
ist out of scope. Um das problem zu beheben, können Sie entweder verschiebenLongOperation
so, dass es ein Mitglied der Klasse, oder erstellen Sie einen Konstruktor fürLongOperation
akzeptiert eineContext
. Sie würden dann verwendennew LongOperation(this).execute();
zum Auftakt der Aufgabe.dies funktionierte perfekt, danke!
InformationsquelleAutor dave.c
Hier ist was Sie tun sollten, um es wie Sie wollen. Verwenden onPostExecude()
Machen pd init im Konstruktor , und pd.show in onPreExecute (), und entfernen Sie es in der onPostExecute(). Und versuchen, pd.schließen() statt pd.verstecken(). Es ist besser. Hier haben Sie die code - > paste2.org/p/1244908
InformationsquelleAutor Bandzio
Sie versuchen, etwas zu tun, was nicht funktioniert. Zunächst werden Sie innerhalb einer Klasse, die Sie erweitert
AsyncTask
so dass Sie nicht haben, Methode zur Verfügung, wie es ist eine Methode der KlasseActivity
.Das zweite problem ist, dass Sie versuchen zu tun, UI-Sachen in eine Methode, der ist nicht synchronisiert mit der UI-thread. Das ist nichts, was Sie würde tun wollen.
Prozess Ihrer JSON-Antwort in der
doInBackground
- Methode auf und übergeben das Ergebnis an dieonPostExecute
Methode, wo Sie in der Lage zu handhaben UI-Zeug wie es ist-synchronisiert mit dem UI-thread.Dem aktuellen setup musst du nicht machen es einfacher für Sie zu handhaben, was Sie zu tun versuchen sowieso. Sie könnten Ihre
LongOperation
Klasse eine private Klasse von IhremActivity
Klasse und definieren dieTextView
als einer Instanz Mitglied. Schnappen Sie es aus der layout-mitfindViewById
im inneren desOnCreate
und ändern von (text-oder was auch immer) in dieonPostExecute
Methode IhrerAsyncTask
.Ich hoffe, es ist einigermaßen klar, was ich meinte.
InformationsquelleAutor Octavian Damiean
findViewById Methode in der Activity-Klasse. Sollten Sie pass-Instanz auf Ihre Aktivitäten LongOperation, wenn Sie Sie erstellen. Verwenden Sie dann diese Instanz nennen findViewById.
Activity
Klasse irgendwo ist höchst gefährlich, wenn Sie nicht wissen, was Sie tun, denn Sie könnten am Ende leckt die gesamte Tätigkeit!InformationsquelleAutor Juhani