1

ClassAsyncTask を別のクラスに使用したいのですが、しようとしていますが、成功していません。これを行う方法についての明確な情報またはアイデアが必要です。前もって感謝します。

public class XMLParser extends Activity {

    String targetURL = "http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml";
    TextView name[], website[], category[];
    LinearLayout linearLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* layout to display the view */
        linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(1);

        /* Set the ContentView to layout for display */
        this.setContentView(linearLayout);

        ClassAsyncTask asyncTask = new GBAsyncTask();
        asyncTask.execute(targetURL);

    }

    //
    public class ClassAsyncTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {

            try {

                /* Handling XML */
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();

                /* Send URL to parse XML Tags */
                URL sourceUrl = new URL(targetURL);

                /* Create handler to handle XML Tags ( extends DefaultHandler ) */
                MyXMLHandler myXMLHandler = new MyXMLHandler();
                xr.setContentHandler(myXMLHandler);
                xr.parse(new InputSource(sourceUrl.openStream()));

            } catch (Exception e) {
                System.out.println("XML Pasing Excpetion = " + e);
            }
            return null;
        }

        /* Return-value from doInBackground */
        protected void onPostExecute(String result) {

            /* Get result from MyXMLHandler SitlesList Object */
            SiteList sitesList = MyXMLHandler.sitesList;

            /* Assign TextView array length by arrayList size */
            name = new TextView[sitesList.getName().size()];
            website = new TextView[sitesList.getName().size()];
            category = new TextView[sitesList.getName().size()];

            int h = sitesList.getName().size();
            /* Set the result text in TextView and add it to layout */
            for (int i = 0; i < h; i++) {
                name[i] = new TextView(getApplicationContext());
                name[i].setText("Name = " + sitesList.getName().get(i));
                website[i] = new TextView(getApplicationContext());
                website[i]
                        .setText("Website = " + sitesList.getWebsite().get(i));
                category[i] = new TextView(getApplicationContext());
                category[i].setText("Website Category = "
                        + sitesList.getCategory().get(i));
                linearLayout.addView(name[i]);
                linearLayout.addView(website[i]);
                linearLayout.addView(category[i]);
            }
        }
    }
}

ありがとう。

4

2 に答える 2

1

ClassAsyncTaskを使用して、別のクラスからアクセスできますXMLParser.ClassAsyncTask

サブクラスを親クラスから独立させたい場合 (用途を広げるため)、親クラスのクラス変数への参照をすべて削除する必要があります。あなたの場合、これはtargetURLです。これを行うには、ターゲット URL を格納するクラス コンストラクターを作成します。

于 2012-09-04T09:23:33.553 に答える
0

それを分離して、現在のコンテキストと、コンストラクターのコールバック メソッドのインターフェイス実装を渡すことができます。次に例を示します。

public class JSONLoader extends AsyncTask<String, Void, String> {
    private AsyncTaskCompleteListener<String> callback;
    private Context context;
    ..

    public JSONLoader(Context context, AsyncTaskCompleteListener<String> cb) {
        this.context = context;
        this.callback = cb;
    }

    ..
    // callback method implemented by calling activity:
    protected void onPostExecute(String result) {
        // call callback method
        callback.onTaskComplete(result);
    }
}

タスクは、この方法でアクティビティから開始されます (拡張する必要がないことに注意してくださいFragmentActivity。拡張することActivityも、そのサブクラスを拡張することもできます)。

public class MainActivity extends FragmentActivity 
    implements AsyncTaskCompleteListener<String> {

    public void onCreate(Bundle savedInstanceState) {
        ..
        JSONLoader jsonLoader = new JSONLoader(this, this);
        jsonLoader.execute(getString(R.string.datasource_url_list));
    }

    // from AsyncTaskCompleteListener interface
    public void onTaskComplete(String result) {
        // your callback method implementation
    }
    ..
}

これは、さまざまなコールバック メソッドを定義するためにアクティビティで使用できるインターフェイスです。

public interface AsyncTaskCompleteListener<T> {
    public void onTaskComplete(T result);

}
于 2012-09-04T09:42:32.797 に答える