无法使用AsyncTask- Android应用程序在另一个活动中调用arraylist

时间:2013-03-06 12:18:26

标签: android json android-asynctask

我有一个应用程序,其中有一个名为“Images1”的单独的类,它扩展了AsyncTask,我通过JSON获取所有图库URL。我在另一个活动中实例化AsyncTask类,我需要在其中返回的arraylist “Images1”类。但是我无法得到arraylist。请建议采取哪些步骤。谢谢提前

public   class Images1 extends AsyncTask<Void, Void,  ArrayList<String>> {
    ProgressDialog mPreogressDialog;
    private static String url = "http://www.tts.com/album_pro/array_to_encode";
     JSONParser jParser = new JSONParser();
     ArrayList<String> image_urls = new ArrayList<String>();
    @Override
    protected void onPreExecute() {

     mPreogressDialog = ProgressDialog.show(Images1.this, "", "Uploading Document. Please wait...", true);
    }

    @Override
    protected  ArrayList<String> doInBackground(Void... params) {
        // TODO Auto-generated method stub
        //Do your stuff here call ur methods
                    imagedownload();
        return image_urls;
    }

    protected void onPostExecute(ArrayList<String> result) {
        super.onPostExecute(result);
        // TODO Auto-generated method stub
        if (mPreogressDialog.isShowing())
            mPreogressDialog.dismiss();


    }



public void imagedownload(){


JSONObject json = jParser.getJSONFromUrl(url);

                try{
            JSONObject seo = json.getJSONObject("SEO");
            JSONArray folio = seo.getJSONArray("Folio");

            JSONArray image_urls1 = new JSONArray();
            String s1=seo.getString("Folio");

                            for(int i=0;i<folio.length();++i)
                            {
                        String m = folio.getString(i);
                        Log.v("M"+i,m);
                        image_urls.add(m+ ",");

                            }
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
}
}

在另一个活动中,我正在实例化该类并将其称为

Images1 img1;
new img1.execute();  

4 个答案:

答案 0 :(得分:2)

  

我无法得到arraylist。

将结果返回到您正在启动的Activity中AsyncTask你将需要执行AsyncTask:

ArrayList<String> image_urls=new Images1.execute(params_).get();

但这将阻止UI线程执行,直到AsyncTask doInBackground方法执行完成。如果您使用AsyncTask.get()方法来避免UI冻结,请使用Thread执行AsyncTask

第二种方法是使用类构造函数将Activity Context传递给Images1类,并在onPostExecute内完成工作。例如:

public   class Images1 extends AsyncTask<Void, Void,  ArrayList<String>> {
 //...your code here..

Context context;

public Images1(Context context){
  this.context=context;
}
////....your code here....

 protected void onPostExecute(ArrayList<String> result) {
        super.onPostExecute(result);
        // TODO Auto-generated method stub

          // do your work here...
    }
}

使用context从onPostExecute

访问或更新UI

答案 1 :(得分:1)

您可以在此处使用消息和处理程序。看一下这篇文章:http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/。您可以从另一个包含ArrayList的线程发送消息。然后在您的活动的handleMessage()函数中处理此消息。

答案 2 :(得分:1)

我建议你只需要接受一个新的Arraylist并创建一个for循环,并在该列表中的image_urls的所有值中添加AsyncTask类的onPostExecute方法并调用该arraytlist。

答案 3 :(得分:0)

另一个选择是扩展此AsyncTask。在您的活动中调用以下代码:

new Images1() {
    protected void onPostExecute(ArrayList<String> result) {
        super.onPostExecute(result);
        //here you process received result
    }
}.execute();