2015-10-23 67 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(),并将其他方法声明为抽象。然后,您的活动将从基本活动扩展您的活动,您只需要实施其他方法。