2017-04-06 1 views
0

저는 Google Calendar API로 작업하고 AsyncTask로 고정되어 있습니다. onPostExecute 내가 추상 클래스를 사용하는 경우 호출 할 수 없습니다.onPostExecute는 AsyncTask <Void, Void, Boolean>에서 추상 클래스로 호출되지 않습니다.

MakeRequestTask.java

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.util.Log; 

import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServicesAvailabilityIOException; 
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; 

import java.io.IOException; 
import java.util.List; 

abstract class MakeRequestTask extends AsyncTask<Void, Void, Boolean> { 
private String TAG = "MakeRequestTask"; 

final MainActivity mainactivity; 
final com.google.api.services.calendar.Calendar mService; 
private Exception mLastError = null; 

ProgressDialog loading = null; 

//Calendar service; 
MakeRequestTask(MainActivity mainactivity) { 
    this.mainactivity = mainactivity; 
    this.mService = mainactivity.mService; 

    loading = new ProgressDialog(mainactivity); 
    loading.setCancelable(true); 
    loading.setMessage("Sync with Google Calendar"; 
    loading.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    Log.i(TAG, "onPreExecute"); 
    mainactivity.numAsyncTasks++; 
    loading.show(); 
} 


@Override 
protected final Boolean doInBackground(Void... ignored) { 
    Log.i(TAG, "doInBackground"); 
    try { 
     doInBackground(); 
     return true; 
    } catch (final GooglePlayServicesAvailabilityIOException availabilityException) { 
     mainactivity.showGooglePlayServicesAvailabilityErrorDialog(
       availabilityException.getConnectionStatusCode()); 
    } catch (UserRecoverableAuthIOException userRecoverableException) { 
     mainactivity.startActivityForResult(
       userRecoverableException.getIntent(), MainActivity.REQUEST_AUTHORIZATION); 
    } catch (IOException e) { 
     //Utils.logAndShow(activity, MainActivity.TAG, e); 
     Log.i(TAG, "IOException" + e); 
    } 
    return false; 
} 

@Override 
protected final void onPostExecute(Boolean success) { 
    super.onPostExecute(success); 
    Log.i(TAG, "onPostExecute"); 
    loading.cancel(); 
    if (0 == --mainactivity.numAsyncTasks) { 
    } 
    if (success) { 
    } 
} 


abstract protected void doInBackground() throws IOException; 

} 

AsyncLoadEvent.java (추상 클래스 중 하나)

import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.util.Log; 

import com.google.api.client.util.DateTime; 
import com.google.api.services.calendar.model.Event; 
import com.google.api.services.calendar.model.Events; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

class AsyncLoadEvent extends MakeRequestTask { 
private String TAG = "AsyncLoadEvent"; 

AsyncLoadEvent(MainActivity mainActivity) { 
    super(mainActivity); 
    this.mainActivity = mainActivity; 
} 

@Override 
protected void doInBackground() throws IOException { 
    Log.i(TAG, "doInBackground"); 
    try { 
     ...... 
    } catch (Exception e) { 
     Log.i(TAG, "Exception" + e); 
     cancel(true); 
    } 
} 
} 

내가 AsyncTask를 추상 클래스를 사용하고 변경하지 않으면 당신은이 질문에서 볼 수 있듯이 다음과 같이 java를 호출하면 onPostExecute가 호출됩니다. 사람도 명확한 설명이나 안내를 제공하는만큼, 해결책은 좋은 것입니다 중복, 내 코드에서 어떤 실수를 지적 할 수 있다면 내가

... 
@Override 
protected final Boolean doInBackground(Void... ignored) { 
    Log.i(TAG, "doInBackground"); 
    return true; 
} 
... 

정말 감사드립니다.

당신이 내 추상 클래스에 더 많은 코드를 원한다면 그렇게 할 것입니다.

답변

0

그래, 몇 가지 해결 후 문제가 발견되었습니다. 내 추상 클래스와 관련이 있습니다.

AsyncLoadEvent.java 클래스는 예외로 뛰어 난의 UI 구성 요소 "getDataFromApi()"를 업데이트하려고하기 때문에 "(참) 취소"를 실행 한

@Override 
protected void doInBackground() throws IOException { 
    Log.i(TAG, "doInBackground"); 
    try { 
     getDataFromApi(); 
    } catch (Exception e) { 
     Log.i(TAG, "Exception : " + e); 
     cancel(true); 
     Log.i(TAG, "cancel(true)"); 
    } 
} 

(추상 클래스 중 하나), 그리고 그런 다음 onPostExecute()를 호출하지 않습니다.

나는 AsyncTask 클래스에서 Override 메소드를 찾았으며 onCancelled()를 사용할 수 있음을 발견했습니다. 그리고 thread 말한다 보았다 : onCancelled (객체)가 발생합니다이 메소드를 호출

doInBackground (개체 [])의 복귀 후 UI 스레드에서 를 호출된다. 이 메서드를 호출하면 onPostExecute (Object)가 호출되지 않습니다. 이 메서드를 호출 한 후에는 isCancelled()를 주기적으로 doInBackground (Object [])에서 반환하여 작업을 최대한 빨리 완료해야합니다.

관련 문제