package com.halzhang.android.example.rxexample; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; import com.jakewharton.rxbinding.view.RxView; import com.jakewharton.rxbinding.view.ViewEvent; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; public class MainActivity extends ActionBarActivity { private static final String LOG_TAG = MainActivity.class.getSimpleName(); private static final String[] CITIES = {"Budapest,hu"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 多个 city 请求 * map,flatMap 对 Observable进行变换 */ Observable.from(CITIES).flatMap(new Func1<String, Observable<WeatherData>>() { @Override public Observable<WeatherData> call(String s) { return ApiManager.getWeatherData(s); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(/*onNext*/new Action1<WeatherData>() { @Override public void call(WeatherData weatherData) { Log.d(LOG_TAG, weatherData.toString()); } }, /*onError*/new Action1<Throwable>() { @Override public void call(Throwable throwable) { } }); /** * 单个 city 请求 */ ApiManager.getWeatherData(CITIES[0]).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<WeatherData>() { @Override public void call(WeatherData weatherData) { Log.d(LOG_TAG, weatherData.toString()); ((TextView) findViewById(R.id.text)).setText(weatherData.toString()); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.e(LOG_TAG, throwable.getMessage(), throwable); } }); /** * Android View 事件处理 */ RxView.clicks(findViewById(R.id.text)) .throttleFirst(500, TimeUnit.MILLISECONDS) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { Toast.makeText(getApplicationContext(), "Progress", Toast.LENGTH_SHORT).show();//主线程 } }); Observable.just("a", "b") .subscribeOn(Schedulers.io()) .doOnSubscribe(new Action0() { @Override public void call() { Log.i(LOG_TAG, "Thread id: " + Thread.currentThread().getId()); Toast.makeText(getApplicationContext(), "Progress", Toast.LENGTH_SHORT).show();//主线程 } }) .subscribeOn(AndroidSchedulers.mainThread())//指定doOnSubscribe在主线程 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.i(LOG_TAG, "Thread id: " + Thread.currentThread().getId()); } @Override public void onError(Throwable e) { Log.i(LOG_TAG, "Thread id: " + Thread.currentThread().getId()); } @Override public void onNext(String s) { Log.i(LOG_TAG, "Thread id: " + Thread.currentThread().getId()); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }