Reputation: 3177
I am trying to run these methods in a asynctask so it doesnt block up my main UI.
Can someone give an example of how to do this?
07-20 17:36:44.550: ERROR/AndroidRuntime(589): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
public void getImages() throws IOException{
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImages.txt");
HttpResponse response;
response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
InputStream is = buf.getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line + "\n");
imageUrl = total.toString();
}
}
public void getImage2() throws IOException{
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImage2.txt");
HttpResponse response;
response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
InputStream is = buf.getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line + "\n");
imageUrl2 = total.toString();
}
}
public class ImageAdapter extends BaseAdapter {
/** The parent context */
private Context myContext;public ImageAdapter() {
// TODO Auto-generated constructor stub
}
/** URL-Strings to some remote images. */
private String[] myRemoteImages = {imageUrl,imageUrl2};
/** Simple Constructor saving the 'parent' context. */
public ImageAdapter(Context c) { this.myContext = c; }
public ImageAdapter(MyTask myTask) {
// TODO Auto-generated constructor stub
}
/** Returns the amount of images we have defined. */
public int getCount() { return this.myRemoteImages.length; }
/* Use the array-Positions as unique IDs */
public Object getItem(int position) { return position; }
public long getItemId(int position) { return position; }
/** Returns a new ImageView to
* be displayed, depending on
* the position passed. */
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(this.myContext);
try {
/* Open a new URL and get the InputStream to load data from it. */
URL aURL = new URL(myRemoteImages[position]);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
/* Buffered is always good for a performance plus. */
BufferedInputStream bis = new BufferedInputStream(is);
/* Decode url-data to a bitmap. */
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
/* Apply the Bitmap to the ImageView that will be returned. */
i.setImageBitmap(bm);
} catch (IOException e) {
Log.e("DEBUGTAG", "Remtoe Image Exception", e);
}
/* Image should be scaled as width/height are set. */
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
/* Set the Width/Height of the ImageView. */
i.setLayoutParams(new Gallery.LayoutParams(150, 150));
return i;
}
/** Returns the size (0.0f to 1.0f) of the views
* depending on the 'offset' to the center. */
public float getScale(boolean focused, int offset) {
/* Formula: 1 / (2 ^ offset) */
return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));
}
}
private class MyTask extends AsyncTask<Void, Void, Void>{
protected void onPreExecute(){
String imageUrl = null;
String imageUrl2 = null;
}
@Override
protected Void doInBackground(Void... arg0) {
try {
getImages();
getImage2();
} catch (IOException e) {
Log.e("MainMenu retreive image", "Image Retreival failed");
e.printStackTrace();
}
((Gallery) findViewById(R.id.gallery))
.setAdapter(new ImageAdapter(this));
return null;
}
}
}
Upvotes: 0
Views: 351
Reputation: 67286
The error you are getting is "Only the original thread that created a view hierarchy can touch its views."
And this error is because you are upating the UI in another thread, so to solve this problem you just need to update the UI like this.
Activityname.this.runOnUiThread(new Runnable() {
@Override
public void run() {
update the UI here......
}
});
Upvotes: 1
Reputation: 1388
This guide will explain everything you need to get started with AsyncTask.
In summary:
doInBackground
onPostExecute
Upvotes: 1