0

AsyncTask を開始するサービスを開始すると、このエラーが発生しますが、別の同様のサービスと AsyncTask が正常に動作します。どちらのサービスもマニフェストで宣言されています。誰かが問題の可能性があることを提案できれば、私はそれを感謝します。たくさん読んだ後、それは AsyncTask の構造/パラメーターに関係していると思いましたので、まだ喜びのないいくつかのバリエーションを試しましたが、正しい方向に進んでいるかどうかはわかりません. アプリケーションをどこにも明示的に拡張しているわけではありません。

09-04 09:13:46.444: E/AndroidRuntime(1190): FATAL EXCEPTION: main
09-04 09:13:46.444: E/AndroidRuntime(1190): java.lang.RuntimeException: Unable to start service couk.jit.currencycheck1.ServiceClassXML@4602fc20 with Intent { flg=0x4 cmp=couk.jit.currencycheck1/.ServiceClassXML (has extras) }: java.lang.ClassCastException: android.app.Application
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.app.ActivityThread.access$3600(ActivityThread.java:125)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.os.Looper.loop(Looper.java:123)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at java.lang.reflect.Method.invokeNative(Native Method)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at java.lang.reflect.Method.invoke(Method.java:521)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at dalvik.system.NativeStart.main(Native Method)
09-04 09:13:46.444: E/AndroidRuntime(1190): Caused by: java.lang.ClassCastException: android.app.Application
09-04 09:13:46.444: E/AndroidRuntime(1190):     at couk.jit.currencycheck1.GetXMLTask.<init>(GetXMLTask.java:52)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at couk.jit.currencycheck1.ServiceClassXML.onStartCommand(ServiceClassXML.java:24)
09-04 09:13:46.444: E/AndroidRuntime(1190):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
09-04 09:13:46.444: E/AndroidRuntime(1190):     ... 10 more

このサービスは、その下で AsyncTask を実行して機能します。

public class ServiceClass extends Service {
SharedPreferences prefs = null;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplication().getApplicationContext());
    boolean run = prefs.getBoolean("running", false);
    if (!run)
        stopSelf();
    else {
        new AsyncNetworkConnection(this.getApplication().getApplicationContext(), true).execute("");
    }
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}
}

動作するAsyncTask。

public class AsyncNetworkConnection extends AsyncTask<String, String, String> {

public AsyncNetworkConnection(Context ct, boolean asService) {
...
}

@Override
protected void onPostExecute(String result) {
...
}

protected String doInBackground(String... arg0) {
String result = null;
...
results = fetchHTML(arg0[0]);
return results;
}

private String fetchHTML(String urlStr) throws URISyntaxException,
        ClientProtocolException, IOException, Exception {
String result = null;
...
return result;
}

}

これは、エラーを発生させるサービスです。「newGetXMLTask」行をコメントアウトすると、エラーは発生しません。それを他の AsyncTask に置き換えると、エラーは発生しません (もちろん、後続のエラー)。ログ メッセージは logcat に表示されます。

public class ServiceClassXML extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("DBG", "ServiceClassXML started");
    prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplication().getApplicationContext());
    boolean run = prefs.getBoolean("running", false);
    if (!run)
        stopSelf();
    else {
        new GetXMLTask(this.getApplication().getApplicationContext(), true).execute("abc");
//          new AsyncNetworkConnection(this.getApplication().getApplicationContext(), true).execute("");
    }
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}
}

エラーを発生させる AsyncTask の基本。

public class GetXMLTask extends AsyncTask<String, Void, List<RateData>> {

public GetXMLTask(Context ct, boolean asService) {
    this.context = (Activity) ct;   //as context can be cast to activity
    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    dataSource = prefs.getInt("srcs", 0);
    runAsService = asService;
    restoredTextFrom = prefs.getString("fromCurr", null);
    restoredTextTo = prefs.getString("toCurr", null);
}

@Override
protected void onPostExecute(List<RateData> rates) {
...
}

@Override
protected List<RateData> doInBackground(String... urls) {
xml = getXmlFromUrl(url);
...
}

private String getXmlFromUrl(String urlString) {
...
return output.toString();
}
}

マニフェストには以下が含まれます。

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="couk.jit.currencycheck1.MainMenu"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name="couk.jit.currencycheck1.ServiceClass"
        android:enabled="true" />
    <service
        android:name="couk.jit.currencycheck1.ServiceClassXML"
        android:enabled="true" />
...
</application>
4

2 に答える 2

3

アプリケーションコンテキストを渡しています

new GetXMLTask(this.getApplication().getApplicationContext(), true).execute("abc");

そして、あなたはそれを次のようなアクティビティコンテキストにキャストしていますthis.context = (Activity) ct;

これはあなたに例外を与えています

Caused by: java.lang.ClassCastException: android.app.Application
于 2013-09-04T11:32:02.963 に答える
0

Context を可変にする必要があります。

 Context ctx = getApplicationContext();

そして、このctxを使用して

 new GetXMLTask(ctx, true).execute("abc");
于 2013-09-04T11:48:18.270 に答える