2017-04-06 15 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(抽象クラ​​スの1)

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

[OK]を、私はいくつかの回避策の後に問題が見つかりました。それは私の抽象クラスに関連していました。

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)"); 
    } 
} 

(抽象クラ​​スの1)、およびその後、onPostExecute()は呼び出されません。

私はAsyncTaskクラスでOverrideメソッドを探していて、onCancelled()が利用可能であることがわかりました。そしてthread氏は述べて見ました:onCancelled(オブジェクト)になります。このメソッドを呼び出すと

doInBackground(オブジェクトは、[])復帰した後、UIスレッド上 を呼び出されて。この メソッドを呼び出すと、onPostExecute(Object)が呼び出されないことが保証されます。 このメソッドを呼び出すと、 のisCancelled()がdoInBackground(Object [])から定期的にチェックされ、 タスクができるだけ早く完了するようにしてください。

関連する問題