Possible Duplicate:
Android - ViewRootImpl$CalledFromWrongThreadException
Im trying to get image from my URL and display in application but it throw error Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. Below is my code
Code
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;
}
}
}
Bad practice of use of AsyncTask,
You are trying to update your Main UI Thread from
doInBackGround()
as AsyncTask never allowed that.Never update your UI from
doInBackGround()
of AsyncTask as its only worker thread. So write your Main UI updatation code inonPostExecute()
method of AsyncTask..will add some points to what @user370305 Said,
You can not touch UI Elements in non-ui thread.
If you are using
AsyncTask
doInBackground
is executed in non-ui thread so you can't access ImageView in that .You can access UI elements in
onPreExecute
,onProgressUpdate
&onPostExcecute
.