向/从AsyncTask发送/接收ArrayList

时间:2014-04-11 14:38:55

标签: android json arraylist android-asynctask

使用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变成了空白。

再次感谢。

3 个答案:

答案 0 :(得分:1)

您可以覆盖主活动中的postexecute,如下所示。

  new myAsyncTask({
            @Override
            void onPostExecute(ArrayList<String> Param){
                //Should be able to do something here
            }
        }).execute(); 

参考 Returning an ArrayList in android AsyncTask class

答案 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();
}

如果您愿意,显然您可以使用该方法向活动发送数据;)