From 484910bced113f352078ba5cea8dd32c97783010 Mon Sep 17 00:00:00 2001 From: danijoo Date: Sat, 7 Nov 2015 11:43:10 +0100 Subject: [PATCH] eventbus --- app/build.gradle | 1 + .../builditbigger/JokeLoaderTaskTest.java | 13 ++++--- .../gradle/builditbigger/JokeLoaderTask.java | 27 +++++++------- .../gradle/builditbigger/MainActivity.java | 1 - .../builditbigger/MainActivityFragment.java | 35 ++++++++++--------- .../udacity/gradle/builditbigger/MyBus.java | 12 +++++++ 6 files changed, 54 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/udacity/gradle/builditbigger/MyBus.java diff --git a/app/build.gradle b/app/build.gradle index 1ce376c..35e5983 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,4 +34,5 @@ dependencies { freeCompile 'com.google.android.gms:play-services-ads:8.3.0' compile project(path: ':jokesbackend', configuration: 'android-endpoints') compile 'com.android.support:design:23.1.0' + compile 'de.greenrobot:eventbus:2.4.0' } diff --git a/app/src/androidTest/java/com/udacity/gradle/builditbigger/JokeLoaderTaskTest.java b/app/src/androidTest/java/com/udacity/gradle/builditbigger/JokeLoaderTaskTest.java index 97e6fca..a9d0368 100644 --- a/app/src/androidTest/java/com/udacity/gradle/builditbigger/JokeLoaderTaskTest.java +++ b/app/src/androidTest/java/com/udacity/gradle/builditbigger/JokeLoaderTaskTest.java @@ -2,29 +2,32 @@ package com.udacity.gradle.builditbigger; import android.test.AndroidTestCase; +import com.google.common.eventbus.Subscribe; + import net.headlezz.jokesbackend.myApi.model.Joke; -public class JokeLoaderTaskTest extends AndroidTestCase implements JokeLoaderTask.JokeLoaderCallback { +public class JokeLoaderTaskTest extends AndroidTestCase { SyncronizeTalker talker; public void testJokeLoader() { - JokeLoaderTask task = new JokeLoaderTask(this); + JokeLoaderTask task = new JokeLoaderTask(); talker = new SyncronizeTalker(); - + MyBus.getInstance().register(this); task.execute(); talker.doWait(); + MyBus.getInstance().unregister(this); } - @Override + @Subscribe public void onJokeLoaded(Joke joke) { assertNotNull(joke); assertTrue(joke.getJoke() != null && !joke.getJoke().isEmpty()); talker.doNotify(); } - @Override + @Subscribe public void onError() { assertTrue(false); talker.doNotify(); diff --git a/app/src/main/java/com/udacity/gradle/builditbigger/JokeLoaderTask.java b/app/src/main/java/com/udacity/gradle/builditbigger/JokeLoaderTask.java index e7919e3..4e6cf7b 100644 --- a/app/src/main/java/com/udacity/gradle/builditbigger/JokeLoaderTask.java +++ b/app/src/main/java/com/udacity/gradle/builditbigger/JokeLoaderTask.java @@ -1,7 +1,7 @@ package com.udacity.gradle.builditbigger; import android.os.AsyncTask; -import android.support.annotation.NonNull; +import android.util.Log; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.extensions.android.json.AndroidJsonFactory; @@ -15,18 +15,11 @@ import java.io.IOException; public class JokeLoaderTask extends AsyncTask { + public static final String TAG = JokeLoaderTask.class.getSimpleName(); static final String ROOT_URL = "http://10.0.3.2:8080/_ah/api/"; MyApi mApi; - JokeLoaderCallback mCallback; - - interface JokeLoaderCallback { - void onJokeLoaded(Joke joke); - void onError(); - } - - public JokeLoaderTask(@NonNull JokeLoaderCallback cb) { - mCallback = cb; + public JokeLoaderTask() { mApi = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null) .setRootUrl(ROOT_URL) .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { @@ -39,6 +32,7 @@ public class JokeLoaderTask extends AsyncTask { @Override protected Joke doInBackground(Void... params) { + Log.d(TAG, "download started"); try { return mApi.tellJoke().execute(); } catch (IOException e) { @@ -48,13 +42,20 @@ public class JokeLoaderTask extends AsyncTask { @Override protected void onPostExecute(Joke joke) { - if(isCancelled()) + if(isCancelled()) { + Log.d(TAG, "download cancelled"); return; + } if(joke != null) { - mCallback.onJokeLoaded(joke); + MyBus.getInstance().post(joke); + Log.d(TAG, "download finished"); } else { - mCallback.onError(); + MyBus.getInstance().post(new JokeDownloadException()); + Log.d(TAG, "download finished with error"); } } + + static class JokeDownloadException extends Exception {} + } diff --git a/app/src/main/java/com/udacity/gradle/builditbigger/MainActivity.java b/app/src/main/java/com/udacity/gradle/builditbigger/MainActivity.java index c0b35c7..76bd44a 100644 --- a/app/src/main/java/com/udacity/gradle/builditbigger/MainActivity.java +++ b/app/src/main/java/com/udacity/gradle/builditbigger/MainActivity.java @@ -14,7 +14,6 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); } - @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. diff --git a/app/src/main/java/com/udacity/gradle/builditbigger/MainActivityFragment.java b/app/src/main/java/com/udacity/gradle/builditbigger/MainActivityFragment.java index 126bca9..2b4302d 100644 --- a/app/src/main/java/com/udacity/gradle/builditbigger/MainActivityFragment.java +++ b/app/src/main/java/com/udacity/gradle/builditbigger/MainActivityFragment.java @@ -1,5 +1,6 @@ package com.udacity.gradle.builditbigger; + import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; @@ -11,15 +12,17 @@ import android.view.ViewGroup; import net.headlezz.androidjokepresenter.JokePresenterActivity; import net.headlezz.jokesbackend.myApi.model.Joke; - /** * A placeholder fragment containing a simple view. */ -public abstract class MainActivityFragment extends Fragment implements View.OnClickListener, JokeLoaderTask.JokeLoaderCallback { +public abstract class MainActivityFragment extends Fragment implements View.OnClickListener { JokeLoaderTask mJokeLoaderTask; - public MainActivityFragment() { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MyBus.getInstance().register(this); } @Override @@ -27,6 +30,7 @@ public abstract class MainActivityFragment extends Fragment implements View.OnCl Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_main, container, false); root.findViewById(R.id.btShowJoke).setOnClickListener(this); + return root; } @@ -35,30 +39,29 @@ public abstract class MainActivityFragment extends Fragment implements View.OnCl downloadNewJoke(); } + /** + * starts the async task to download and show a new joke + * cancels old downloads if theres already a running one + */ private void downloadNewJoke() { - mJokeLoaderTask = new JokeLoaderTask(this); + if(mJokeLoaderTask != null) { + mJokeLoaderTask.cancel(true); + } + mJokeLoaderTask = new JokeLoaderTask(); mJokeLoaderTask.execute(); } - @Override - public void onJokeLoaded(Joke joke) { + public void onEvent(Joke joke) { Intent i = new Intent(getContext(), JokePresenterActivity.class); i.putExtra(JokePresenterActivity.BUNDLE_ARG_JOKE, joke.getJoke()); startActivity(i); } - @Override - public void onError() { - if (getView() != null) - Snackbar.make(getView(), R.string.joke_download_error, Snackbar.LENGTH_LONG) + public void onEvent(JokeLoaderTask.JokeDownloadException e) { + if (getActivity() != null) + Snackbar.make(getActivity().findViewById(android.R.id.content), R.string.joke_download_error, Snackbar.LENGTH_LONG) .setAction(R.string.retry, this) .show(); } - @Override - public void onStop() { - if(mJokeLoaderTask != null && !mJokeLoaderTask.isCancelled()) - mJokeLoaderTask.cancel(true); - super.onStop(); - } } diff --git a/app/src/main/java/com/udacity/gradle/builditbigger/MyBus.java b/app/src/main/java/com/udacity/gradle/builditbigger/MyBus.java new file mode 100644 index 0000000..03ebc8f --- /dev/null +++ b/app/src/main/java/com/udacity/gradle/builditbigger/MyBus.java @@ -0,0 +1,12 @@ +package com.udacity.gradle.builditbigger; + +import de.greenrobot.event.EventBus; + +public class MyBus { + + private static EventBus bus = new EventBus(); + + public static EventBus getInstance() { + return bus; + } +}