AsyncTask에 여러 프리미티브를 전달하는 것은 (엄격하게 말하면) 불가능합니다. 예를 들어 해당 방법 을 수행 myTask.execute(long1, long2)
하고 설정 하려는 경우 private class myTask extends AsyncTask<long, Void, Void>
:
@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}
IDE는 상위 유형 메서드를 재정의해야한다고 불평 할 것입니다. 에 대한 소위 Varargs 메서드 서명을 사용 doInBackground
하고 있습니다. (long... params)
"나는 params라는 배열로 저장된 가변 수의 long을 허용합니다. 컴파일러 / IDE 불만이 제기되는 원인을 완전히 이해하지 못합니다. ,하지만 제네릭 클래스 Params
가 정의 되는 방식과 관련이 있다고 생각합니다 .
어떤 경우 든, 프리미티브를 각각의 프리미티브가 아닌 래퍼 (예 : int => Integer, long => Long 등)로 올바르게 캐스트한다면 문제없이 원하는 것을 얻을 수 있습니다. 사실, 당신은 당신의 프리미티브를 프리미티브가 아닌 것으로 명시 적으로 캐스팅 할 필요가 없습니다. Java가 당신을 위해 그것을 처리하는 것 같습니다. 다음과 같이 ASyncTask를 설정하기 만하면됩니다 (예 : longs).
private class MyTask extends AsyncTask<Long, Void, Void> {
@Override
protected void doInBackground(Long... params) {
long myFirstParam = params[0]
}
...
}
그런 다음 원래 의도 한대로이 클래스를 사용할 수 있습니다. 예 :
MyTask myTask = new MyTask();
myTask.execute(long1, long2);
또는 원하는 수의 프리미티브에 대해 동일한 유형으로 제공됩니다. 여러 유형의 프리미티브를 전달해야하는 경우이 작업도 수행 할 수 있지만 위의 내용을 다음과 같이 수정해야합니다.
private class MyTask extends AsyncTask<Object, Void, Void> {
@Override
protected void doInBackground(Object... params) {
long myLongParam = (Long) params[0];
int myIntParam = (Integer) params[1];
}
...
}
이것은 더 유연하지만 매개 변수를 각각의 유형으로 명시 적으로 캐스팅해야합니다. 이러한 유연성이 필요하지 않은 경우 (즉, 단일 데이터 유형), 약간 더 읽기 쉬운 첫 번째 옵션을 고수하는 것이 좋습니다.