Intereting Posts
Получить представление root из текущей активности Обнаружение анимации в Android RecyclerView DownloadManager загружает файлы более 2,1 ГБ Блокировка устройства Android для запуска только одного приложения Каковы способы программного создания наборов цветов Material Design? Проблема с Robolectric с новой версией сервисов Google Play Задержка в потоковом аудио Android ListView в действии становится обновленным при изменении ориентации Как создать дизайн материала, например, обычную полосу прокрутки с цифрами и буквенными буквами в recylerview Android WebView addJavascriptInterface не работает, если webview создается в обратном вызове WebChromeClient # onCreateWindow Xamarin: Не удалось открыть сеанс для виртуальной машины Nexus 7 (Lollipop) Android: не удалось создать каталог для файла SharedPreferences Какова цель идентификатора элемента в Android ListView Adapter? Ошибка lib / gdbserver: разрешение отклонено Settings.Secure.HTTP_PROXY устарел в ICS, но нет информации о замене

Android – вызвано: android.view.ViewRootImpl $ CalledFromWrongThreadException

Возможный дубликат:
Android – ViewRootImpl $ CalledFromWrongThreadException

Im пытается получить изображение из моего URL-адреса и отображать его в приложении, но он выдает ошибку. Caused by: android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений . Ниже мой код

Код

package com.smartag.bird.dev; public class MainActivity extends Activity { static String ndefMsg = null; static String ndefMsg1 = null; NfcAdapter mNfcAdapter; PendingIntent mNfcPendingIntent; IntentFilter[] mNdefExchangeFilters; static final String TAG = "Read Tag"; TextView mTitle; private static ImageView imageView; static String url = "http://sposter.smartag.my/images/chicken_soup.jpg"; private static Bitmap downloadBitmap; private static BitmapDrawable bitmapDrawable; private static boolean largerImg = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndefDetected.addDataType("text/plain"); } catch (MalformedMimeTypeException e) { } mNdefExchangeFilters = new IntentFilter[] { ndefDetected }; if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { NdefMessage[] messages = getNdefMessages(getIntent()); byte[] payload = messages[0].getRecords()[0].getPayload(); ndefMsg = new String(payload); setIntent(new Intent()); // Consume this intent. } ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(ndefMsg == null || ndefMsg.length() == 0) { startActivity(new Intent(MainActivity.this, MainMenu.class)); } else { setContentView(R.layout.main); if (mWifi.isConnected()) { ndefMsg1 = ndefMsg; new DownloadFilesTask().execute(); ndefMsg = null; } else { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("Attention"); dialog.setMessage("No Internet Connection. Please enable the wifi."); dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); dialog.show(); } } } private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { protected void onPostExecute(Void result) { } @Override protected Void doInBackground(Void... params) { try { URL myFileUrl = new URL("http://sposter.smartag.my/images/chicken_soup.jpg"); HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); downloadBitmap = BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ImageView image = (ImageView) findViewById(R.id.imview); image.setImageBitmap(downloadBitmap); return null; } } } 

Solutions Collecting From Web of "Android – вызвано: android.view.ViewRootImpl $ CalledFromWrongThreadException"

Плохая практика использования AsyncTask ,

Вы пытаетесь обновить основной doInBackGround() пользовательского интерфейса из doInBackGround() поскольку AsyncTask никогда не допускал этого.

Никогда не обновляйте свой пользовательский интерфейс из doInBackGround() AsyncTask в качестве единственного рабочего потока. Поэтому напишите код onPostExecute() основного интерфейса пользователя в onPostExecute() AsyncTask ..

 @Override protected Void doInBackground(Void... params) { try { URL myFileUrl = new URL("http://sposter.smartag.my/images/chicken_soup.jpg"); HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); downloadBitmap = BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override onPostExecute() { ImageView image = (ImageView) findViewById(R.id.imview); image.setImageBitmap(downloadBitmap); } 

Добавит некоторые моменты к тому, что @ user370305 Сказал,

Вы не можете прикасаться к элементам пользовательского интерфейса в потоке, отличном от ui.

Если вы используете AsyncTask doInBackground выполняется в потоке non-ui, поэтому вы не можете получить доступ к ImageView в этом.

Вы можете получить доступ к элементам пользовательского интерфейса в onPreExecute , onProgressUpdate & onPostExcecute .