2

別のスレッドでデータをダウンロードして解析するために AsyncTask を使用しています。loadXml によって返された値をデータベースに渡す必要があります。

問題は、コンテキストが必要であり、DownloadXmlTask​​ がインスタンス化されるアクティビティ クラスとは別のクラスにあるため、データベースをインスタンス化できないことです。

データベース クラスをインスタンス化できない場合、値をデータベースに渡すにはどうすればよいですか?

コードサンプル:

public class DownloadXmlTask extends AsyncTask<String,Void,Void>{

public static final String TAG = "VotingApp";

@Override
protected Void doInBackground(String... urls) {
    try {
        // Get the parsed list of Candidate objects
        ArrayList<Candidate> candidatesList = loadXml(urls[0]);
        CandidatesDatabaseHelper db = new CandidatesDatabaseHelper(getApplicationContext()); <---- ERROR (I know I can't use getApplicationContext() here)

        // Insert the candidates into the database
        for(Candidate c : candidatesList){
                      //NOT FINISHED
        }

    } catch (IOException e) {
        Log.d(TAG, "Error " + e);
    } catch (XmlPullParserException e) {
        Log.d(TAG, "Error " + e);
    }
    Log.d(TAG, "NOT WORKING");
    return null;
}
4

1 に答える 1

0

AsyncTask を内部クラスにすることでその問題を解決できますが、現在行っている方法で行うだけであれば、技術的には次のことができますAsyncTask<Object,Void,Void>

@Override
protected Void doInBackground(Object... urls) {
    Context context = (Context)urls[0]; //should always be true by your own rules
    /*then you can also loop the urls for the rest of the Strings to cast
    **if there are going to be more. Or not. Your choice*/
//.....

の代わりにString。を呼び出すときは.execute(this, someString)、最初に Context を送信し、次に String を送信します。次に、それぞれを適切な変数にキャストするだけです。それを試して、うまくいくかどうか教えてください。残念ながら今はテストできないので、テストする必要があります。

于 2012-12-08T02:07:02.597 に答える