Метод findViewById (int) не определен

Я новичок в разработке Android, и я пытаюсь закодировать небольшое приложение, которое позволяет мне захватить внешний JSON-файл и проанализировать его. Я получил это, чтобы работать, однако это не сработает, если я попытаюсь выполнить его в фоновом режиме как AsyncTask . Eclipse дает мне ошибку

Метод findViewById (int) не определен для типа LongOperation

В этой строке:

TextView txtView1 = (TextView) findViewById (R.id.TextView01);

Вот мой код:

 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); } } 

Есть какие нибудь идеи как это починить?

Реализация AsyncTask в одном из других ответов неверна. Диалог прогресса создается каждый раз в пределах publishProgress , и ссылка на диалог не видна вне метода. Вот моя попытка:

 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> { ProgressDialog pd = null; TextView tv = null; @Override protected void onPreExecute(){ tv = Main.this.findViewById(R.id.textvewid); pd = new ProgressDialog(Main.this); pd.setMessage("Working..."); // setup rest of progress dialog } @Override protected String doInBackground(String... params) { //perform existing background task return result; } @Override protected void onPostExecute(String result){ pd.dismiss(); tv.setText(result); } } } 

Вот что вы должны сделать, чтобы он работал так, как вы хотите. Использовать onPostExecude ()

 public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new LongOperation(this).execute(); } } class LongOperation extends AsyncTask<String, Void, String> { private Main longOperationContext = null; public LongOperation(Main context) { longOperationContext = context; Log.v("LongOper", "Konstuktor"); } @Override protected String doInBackground(String... params) { Log.v("doInBackground", "inside"); StringBuilder sb = new StringBuilder(); 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); Log.v("line = ", "jo.getString() ="+jo.getString("text")); sb.append(jo.getString("text") + " - " + jo.getString("secondtest")).append("\n"); } } catch (MalformedURLException e) { e.printStackTrace(); Log.v("Error", "URL exc"); } catch (IOException e) { e.printStackTrace(); Log.v("ERROR", "IOEXECPTOIn"); } catch (JSONException e) { e.printStackTrace(); Log.v("Error", "JsonException"); } String result = sb.toString(); return result; } @Override protected void onPostExecute(String result) { Log.v("onPostExe", "result = "+result); TextView txtView1 = (TextView)longOperationContext.findViewById(R.id.textView01); txtView1.setText(result); } protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { ProgressDialog pd = new ProgressDialog(longOperationContext); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("Working..."); pd.setIndeterminate(true); pd.setCancelable(false); } } 

Вы пытаетесь сделать что-то, что не сработает. Прежде всего, вы находитесь внутри класса, который расширяет AsyncTask поэтому вы не сможете использовать этот метод, поскольку это метод класса Activity .

Вторая проблема заключается в том, что вы пытаетесь сделать материал UI в методе, который не синхронизирован с потоком пользовательского интерфейса. Это не то, что вы хотели бы сделать.

Обработайте ответ JSON в методе doInBackground и передайте результат методу onPostExecute где вы сможете обрабатывать материал пользовательского интерфейса, поскольку он синхронизируется с потоком пользовательского интерфейса.

Текущая настройка у вас не облегчит вам обработку того, что вы пытаетесь сделать в любом случае. Вы можете сделать свой класс LongOperation приватным классом класса Activity и определить TextView в качестве члена экземпляра. Возьмите его с макета, используя findViewById внутри вашего OnCreate и измените (установите текст или что-то еще) внутри метода AsyncTask вашего AsyncTask .

Надеюсь, это несколько ясно, что я имел в виду.

FindViewById – метод в классе Activity. Когда вы его создадите, вы должны передать экземпляр своей деятельности в свой LongOperation. Затем используйте этот экземпляр для вызова findViewById.

Intereting Posts
Является ли обработка HTTP-звонков с помощью множества умышленных сервисов хорошим подходом? Ошибка PhoneTapansfer.upload () метаданных Phonegap () для Android 3 на Android Ошибка записи видео на Android FireMonkey TControl.MakeScreenshot генерирует низкоуровневое растровое изображение на мобильных платформах Скрыть виртуальную клавиатуру при нажатии кнопки Как остановить / отменить андроид CountDownTimer Почему мой диалог искажения искажается? исключение нулевого указателя Можно ли использовать картографию для элемента списка и как Имея библиотеку LLVM IR, как перекрещивать ее с iOS, Android, Windows и Mac от Ubuntu? АББ + Samsung Galaxy Событие мыши в Adobe Air для Android (попытка написать Adobe Native Extension) Как запускает доступ к пакету значков? Реализация пользовательского предложения для поисковой активности android Как отключить кнопки физического уровня на Android? Как правильно очистить все уведомления после щелчка?