0

我有一个应用程序,其中有一个名为“Images1”的单独类,它扩展了 AsyncTask,其中我通过 JSON 获取所有画廊 URL。我在另一个活动中实例化 AsyncTask 类,我需要“Images1”返回的数组列表class.However 我无法获得数组列表。请建议应该采取哪些步骤。在此先感谢

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

4 回答 4

2

我无法获取数组列表。

要将结果返回到您正在启动 AsyncTask 的 Activity 中,您需要执行 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

于 2013-03-06T12:29:16.160 回答
1

我会建议你做一件事,只需使用新的 Arraylist 并创建一个 for 循环,然后在onPostExecuteAsyncTask 类的 Method 中添加该列表中 image_urls 的所有值,然后调用该 arraytlist。

于 2013-03-06T12:33:57.617 回答
1

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

于 2013-03-06T12:27:06.393 回答
0

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

new Images1() {
    protected void onPostExecute(ArrayList<String> result) {
        super.onPostExecute(result);
        //here you process received result
    }
}.execute();
于 2013-03-06T13:17:05.953 回答