0

AsyncTask を拡張する「Images1」という名前の別のクラスを持つアプリケーションがあります。ここで、JSON を介してすべてのギャラリー URL を取得しています。「Images1」によって返される配列リストが必要な別のアクティビティで AsyncTask クラスをインスタンス化しています。 class.しかし、配列リストを取得できません。取るべき手順を提案してください。事前に感謝します

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 を開始しているアクティビティで結果を取得するには、AsyncTask を次のように実行する必要があります。

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

ただし、これにより、AsyncTask doInBackground メソッドの実行が完了するまで UI スレッドの実行がブロックされます。UI のフリーズを避けるためにAsyncTask.get()Threadメソッドを使用している場合は、AsyncTask を実行するために使用します。

2 番目の方法は、クラス コンストラクターを使用して 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...
    }
}

contextonPostExecute から UI にアクセスまたは更新するために使用します

于 2013-03-06T12:29:16.160 に答える
1

新しい Arraylist を取得して for ループを作成し、そのリストの image_urls のすべての値をonPostExecuteAsyncTask クラスのメソッドに追加して、その 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

もう 1 つのオプションは、この AsyncTask を拡張することです。アクティビティで次のコードを呼び出します。

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