Java 多个异步任务,ConcurrentModificationException。救命安卓
我正在为Android制作一个照片流应用程序。为了避免内存问题,我运行了两个异步任务来提取数据。获取JSON对象并将其解析为自定义对象(如下所示:)Java 多个异步任务,ConcurrentModificationException。救命安卓,java,android,image,bitmap,android-asynctask,Java,Android,Image,Bitmap,Android Asynctask,我正在为Android制作一个照片流应用程序。为了避免内存问题,我运行了两个异步任务来提取数据。获取JSON对象并将其解析为自定义对象(如下所示:) 一般来说,我是网络代码的新手,也是JSON的新手。感谢您的帮助 在Java中,不允许按原样使用foreach循环修改列表。这就是为什么会调用ConcurrentModificationException。有关更多信息,请参阅 您可以使用普通的for循环,并以这种方式进行迭代/修改 package edu.iastate.its.webdev
一般来说,我是网络代码的新手,也是JSON的新手。感谢您的帮助 在Java中,不允许按原样使用foreach循环修改
列表。这就是为什么会调用ConcurrentModificationException。有关更多信息,请参阅
您可以使用普通的for循环,并以这种方式进行迭代/修改
package edu.iastate.its.webdev.training.photostream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.JsonReader;
public class StringAsync extends AsyncTask<String, Integer, String>
{
@Override
protected String doInBackground(String...urls)
{
InputStream content = null;
DefaultHttpClient temp = new DefaultHttpClient();
HttpGet temp2 = new HttpGet(urls[0]);
try {
HttpResponse temp3 = temp.execute(temp2);
content = temp3.getEntity().getContent();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Reader reader = null;
try {
reader = new InputStreamReader(content, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
char[] buffer = new char[Integer.MAX_VALUE/200];
try {
reader.read(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new String(buffer);
}
@Override
protected void onPostExecute(String result)
{
if(result == null) throw new IllegalStateException("No result");
if(result.substring(0, 3).equals("null")) result = result.substring(4, result.length()-1);
super.onPostExecute(result);
JsonReader temp = new JsonReader(new StringReader(result));
try {
temp.beginArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
temp.setLenient(true);
try {
while(temp.hasNext())
{
PhotoItem tempItem = new PhotoItem("null", 0, 0, "null", "null", "null");
temp.beginObject();
temp.skipValue();
tempItem.setId(temp.nextInt());
temp.skipValue();
tempItem.setName(temp.nextString());
temp.skipValue();
tempItem.setDescription(temp.nextString());
temp.skipValue();
temp.skipValue();
temp.skipValue();
temp.skipValue();
temp.skipValue();
temp.skipValue();
temp.skipValue();
tempItem.setThumbImageURL(temp.nextString());
temp.skipValue();
temp.skipValue();
temp.skipValue();
tempItem.setFullImageURL(temp.nextString());
temp.skipValue();
tempItem.setViewsNumber(temp.nextInt());
temp.skipValue();
temp.skipValue();
temp.skipValue();
temp.skipValue();
//temp.skipValue();
temp.endObject();
MainActivity.photos.add(tempItem);
}
//temp.endArray();
temp.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package edu.iastate.its.webdev.training.photostream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
public class PhotoAsync extends AsyncTask<ArrayList<PhotoItem>, Integer, Bitmap>
{
private ArrayList<PhotoItem> temp = null;
@Override
protected synchronized Bitmap doInBackground(ArrayList<PhotoItem>...idArg)
{
temp = idArg[0];
String tempURL = "null";
for(PhotoItem p : temp)
{
p.setThumbImageBM(getBitmapFromURL(p.getThumbURL()));
p.setFullImageBM(getBitmapFromURL(p.getFullURL()));
}
if(temp.size() > 0)
return temp.get(0).getLargeImage();
else
return null;
}
@Override
protected synchronized void onPostExecute(Bitmap result)
{
}
private Bitmap getBitmapFromURL(String src)
{
try {
java.net.URL url = new java.net.URL(src);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 8;
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
04-15 17:52:04.539: W/dalvikvm(23235): threadid=14: thread exiting with uncaught exception (group=0x417c0da0)
04-15 17:52:04.539: E/AndroidRuntime(23235): FATAL EXCEPTION: AsyncTask #4
04-15 17:52:04.539: E/AndroidRuntime(23235): Process: edu.iastate.its.webdev.training.photostream, PID: 23235
04-15 17:52:04.539: E/AndroidRuntime(23235): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 17:52:04.539: E/AndroidRuntime(23235): at android.os.AsyncTask$3.done(AsyncTask.java:300)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
04-15 17:52:04.539: E/AndroidRuntime(23235): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.lang.Thread.run(Thread.java:841)
04-15 17:52:04.539: E/AndroidRuntime(23235): Caused by: java.util.ConcurrentModificationException
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
04-15 17:52:04.539: E/AndroidRuntime(23235): at edu.iastate.its.webdev.training.photostream.PhotoAsync.doInBackground(PhotoAsync.java:25)
04-15 17:52:04.539: E/AndroidRuntime(23235): at edu.iastate.its.webdev.training.photostream.PhotoAsync.doInBackground(PhotoAsync.java:1)
04-15 17:52:04.539: E/AndroidRuntime(23235): at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-15 17:52:04.539: E/AndroidRuntime(23235): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-15 17:52:04.539: E/AndroidRuntime(23235): ... 4 more