2015-10-23 71 views
0

在Android中,當我使用AsyncTask,我通常使用的接口方法,這樣我可以在activity實現它:默認接口實現

public class DownloadTask extends AsyncTask<String, Integer, Response> { 

private Context context; 
private DownloadTaskListener listener; 
private List<MyObject> objectList; 


public interface DownloadObjectsTaskListener { 
    void startTask(); 
    void finishTask(); 
    void ObjectsDownloaded(List<Object> ObjectList); 

    void withoutInternet(); 
} 

public DownloadObjectsTask(Context context) { 
    this.context = context; 
} 


public void setListener(DownloadObjectsTaskListener listener) { 
    this.listener = listener; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

    if (CommonUtils.isThereInternetConnection(context)) { 
     listener.startTask(); 
    } else { 
     listener.withoutInternet(); 
     cancel(true); 
    } 
} 

protected Response doInBackground(String... urls) { 
    RestApiObject api2 = new RestApiObject(); 
    return api2.getMyObjects(); 

} 

protected void onPostExecute(Response results) { 
    listener.finishTask(); 
    if (results != null) { 
     if (results.body() != null) { 
      ObjectsResponse request = (ObjectsResponse) results.body(); 
      ObjectList = request.getObjectsList(); 
      listener.ObjectsDownloaded(ObjectList); 
     } else { 
      ResponseBody jsonObject = results.errorBody(); 
      try { 
       Log.d(DEBUG, jsonObject.string()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } else { 
     Log.d(DEBUG, "result is null"); 
    } 

    } 
} 

,然後在我的Activity,我實現接口,並定義方法。

事情是爲方法,如withoutInternet(),方法定義將永遠是相同的,所以它將只是冗餘代碼每次我重新定義方法的實現,即使我提取代碼的方法。

有沒有辦法定義一次withoutInternet()

回答

2

當然,你想要一個abstract類,而不是一個interface.像這樣:

public abstract DefaultDownloadObjectTasksListener implements DownloadObjectsTaskListener{ 
    abstract void startTask(); 
    abstract void finishTask(); 
    abstract void ObjectsDownloaded(List<Object> ObjectList); 

    void withoutInternet(){ 
     //some default implementation 
    } 
} 

然後您就可以extend(相對於implement)抽象類中重寫要爲提供功能的方法。由於前三種方法是abstract,您將被要求覆蓋它們。但是,因爲withoutInternet不是抽象的,所以將使用默認實現,除非您選擇覆蓋它。

編輯爲了解決您的問題:那麼解決辦法是讓你的DefaultDownloadObjectTasksListener延長AppCompatActivity和實施DownloadObjectsTaskListener,然後從你的活動延伸DefaultDownloadObjectTasksListener

或者,如果你真的想要一個默認的實現,我會做的就是使用匿名子類作爲監聽器。

+0

我無法在我的活動中擴展抽象類,因爲活動已經擴展AppCompatActivity。 –

+0

@JuliatzindelToro看到我的編輯 –

0

您可以創建一個實現接口的基本活動,實現withoutInternet(),並將其他方法聲明爲抽象。然後,您的活動將從基本活動擴展您的活動,您只需要實施其他方法。