使用JSON我修剪了在线图库的URL,并用图像源或图像URL填充了数组列表。
我现在想要将ArrayList返回给MainActivity,以便我可以将ArrayList转换为Array并使用该Image of Image URL下载图像并将它们放在gridview中。
我的问题是我没有将ArrayList从AsyncTask返回到MainActivity。任何指针都将非常感激。
感谢您的时间。
主要活动:
public class MainActivity extends Activity {
public static ArrayList<String> list = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new myAsyncTask().execute(list);
Log.v("jknfsda: ",list.get(1));
//TextView line1 = (TextView) findViewById(R.id.line1);
//for(int i=0; i<list.size(); i++){
// line1.append(i+1 + ": " + list.get(i));
}
}
的AsyncTask:
public class myAsyncTask extends AsyncTask<ArrayList<String>, Void, ArrayList<String>> {
static String quellaGalleryInfo = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22http%3A%2F%2Fwww.quellabicycle.com%2Fgallery%22&format=json&callback=";
public static ArrayList<String> urlArr = new ArrayList<String>();
@Override
protected ArrayList<String> doInBackground(ArrayList<String>... list) {
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(quellaGalleryInfo);
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null; // Hold all of the data from the URL
try{
HttpResponse response = httpclient.execute(httppost); //Response from webservice (may or may not get)
HttpEntity entity = response.getEntity(); // all the content from the requested URL along with headers etc.
inputStream = entity.getContent(); // get maincontent from URL
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),8);// Read all data from inputStream until buffer is full
StringBuilder theStringBuilder = new StringBuilder();//Store all the data
String line = null;
while((line = reader.readLine())!=null){
theStringBuilder.append(line + "\n");
}
//read all the data from the buffer until nothing is left
result = theStringBuilder.toString(); // everything now inside result
}
catch (Exception e){
e.printStackTrace();
}
finally { //close inputstream
try{
if(inputStream !=null) inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
JSONObject jsonObject;
try{
Log.v("JSONParser Result: ", result);
jsonObject = new JSONObject(result);//object of all the data
JSONObject queryJSONObject = jsonObject.getJSONObject("query");//get query objects
JSONObject resultsJSONObject = queryJSONObject.getJSONObject("results");//get results object inside of query object
JSONObject bodyJSONObject = resultsJSONObject.getJSONObject("body");
JSONArray divJSONArray = bodyJSONObject.getJSONArray("div");
JSONObject div_position_zero = divJSONArray.getJSONObject(0);
JSONArray ulJSONArray = div_position_zero.getJSONArray("ul");
JSONObject ul_position_two = ulJSONArray.getJSONObject(2);
JSONArray liJSONArray = ul_position_two.getJSONArray("li");
for(int i=0; i < liJSONArray.length(); i++){
JSONObject li_position = liJSONArray.getJSONObject(i);
JSONObject a_JSONObject = li_position.getJSONObject("a");
JSONObject imgJSONObject = a_JSONObject.getJSONObject("img");
urlArr.add(imgJSONObject.getString("src"));//final object where data resides
}
for(String item : urlArr){
Log.v("JSONParser list items: ", item);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
//protected void onPostExecute(ArrayList<String>... list){
// if(MainActivity.list.size()>0){
// MainActivity.list.clear();
//for(int i =0; i<urlArr.size();i++){
// Log.v("ope urlarr: ", urlArr.get(i));
//MainActivity.list.add(urlArr.get(i));
//}
}
}
}
直到这里工作 Log.v(&#34; JSONParser列表项:&#34;,item); 然后我的LogCat变成了空白。
再次感谢。
答案 0 :(得分:1)
您可以覆盖主活动中的postexecute,如下所示。
new myAsyncTask({
@Override
void onPostExecute(ArrayList<String> Param){
//Should be able to do something here
}
}).execute();
答案 1 :(得分:0)
在AsyncTask
:
在doInBackground
末尾返回正确的值,您总是返回null
。
for(String item : urlArr){
Log.v("JSONParser list items: ", item);
}
return urlArr;
您可以在onPostExecute
中访问它,只需取消注释并使用list参数(您也可以使用非静态ArrayList
)。
答案 2 :(得分:0)
我可以看到,有两个错误: 第一个是你将列表的一个实例传递给asynctask,但是从不用结果填充它:而是创建并填充一个名为urlArr的新ArrayList。您应该填充doInBackground()参数中检索到的那个。由于varargs语法,您可以这样做:
ArrayList<String> myList = list[0];
这是因为在vararg语法中,您可以传递可变数量的参数,并且它们将被表示为一个名为“list”的数组。
第二个错误是您无法知道asynctask执行何时终止。在onCreate方法中,您将在调用后立即读取结果。但asynctask基本上是Java Thread的包装器,旨在异步执行代码。当你打电话
Log.v("jknfsda: ",list.get(1));
你的数组可能仍然是空的。您应该使用回调来通知活动结果已准备就绪。一种简单的方法是将活动实例传递给asynctask类
new myAsyncTask(this).execute(list);
,在asynctask类中检索它并将其存储在字段
中protected ArrayList<String> myAsyncTask(MainActivity context){...}
最后,通过onPostExecute中的活动通知活动中的方法。例如,如果您在活动中创建了一个名为myResultsAreReady()的方法,则可以将其称为:
protected void onPostExecute(ArrayList<String>... list){
context.myResultsAreReady();
}
如果您愿意,显然您可以使用该方法向活动发送数据;)