Tesela

Additional

Language
Java
Version
N/A
Created
Mar 21, 2016
Updated
May 7, 2016 (Retired)
Owner
Rayco Arana Rodriguez (raycoarana)
Contributor
Rayco Arana Rodriguez (raycoarana)
1
Activity
Badge
Generate
Download
Source code

Tesela

Tesela is a code generate based library that helps you implement Model-View-Presenter pattern on Android. It let you annotate methods to make them be executed on UI thread or on a background thread. It will help you to keep a weak reference to the view, so forget about leaking your Fragment or Activity anymore while your background work finishes.

How to use it?

The first thing to do is to initialize Tesela providing it a TeselaExecutor implementation. That way you can control where background work will be executed, how many threads are created, use an standard Java thread pool or other kind of thread pool.

public class SampleApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        final Handler mainThreadHandler = new Handler();
        final Executor backgroundExecutor = Executors.newSingleThreadExecutor();
        Tesela.init(new TeselaExecutor() {
                    
                        @Override
                        public boolean isMainCurrentThread() {
                            return Looper.myLooper() == Looper.getMainLooper();
                        }
                    
                        @Override
                        public void executeInUIThread(Runnable runnable) {
                            mainThreadHandler.post(runnable);
                        }
                    
                        @Override
                        public void executeInBackground(Runnable runnable) {
                            executeInBackground(runnable, null);
                        }
                    
                        @Override
                        public void executeInBackground(Runnable runnable, String tag) {
                            backgroundExecutor.execute(runnable);
                        }
                    
                    });
    }

}

Once you have Tesela initialized, you just have to annotate your classes, the first thing is annotate your view interface with the @View annotation.

@View
public interface HelloWorldView {
    void showMessage(String message);
}

Then on your presenter, annotate your view attribute and change it's type to WeakXXXX, where XXXX is the name of the view interface. This class will hold a weak reference to your view and will have all methods of your interface, so you don't have to deal with the weak reference.

public class HelloWorldPresenter {

    @ViewReference
    protected WeakHelloWorldView mView;

    public void onInitialize(HelloWorldView view) {
        mView = WeakHelloWorldView.of(view);
    }
    
...    

Now simply annotate methods that needs to be executed on a background thread with @Background and methods that needs to be executed in UI thread with @UI.

    @Background
    protected void onDoSomething() {
        //Do some hard work here

        refreshView();
    }

    @UI
    protected void refreshView() {
        mView.showMessage("HelloWorld");
    }

Finally in your DI framework make sure every time you inject your presenter, the generated presenter by Tesela is injected instead.

    @Provides
    protected HelloWorldPresenter provideHelloWorldPresenter(TeselaHelloWorldPresenter impl) {
        return impl;
    }

Take a look at the Sample project!

Download

Download via Gradle:

compile 'com.raycoarana.tesela:tesela-library:0.0.2'
apt 'com.raycoarana.tesela:tesela-compiler:0.0.2'

License

Copyright 2016 Rayco Araña

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.