0
我想使用Retrofit 2.0獲取股票代碼和價格,然後在列表視圖中顯示它們。問題是我努力編寫我的ApiService類,所以我可以做出異步請求。如何在Android中使用Retrofit 2.0獲取股票代碼和價格
public final class StockApiService {
public interface StockApiServiceInterface {
// unsafe=true ensures unsafe response. Prevents HTML escape characters
@GET("/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=")
Call<ResultWrapper> listQuotes(
**// I don’t know what to write here**
}
}
我創建了基於POJO從這個URL返回的JSON數據:
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=
這裏是我的代碼的其餘部分。
ResultWrapper
public class ResultWrapper {
@SerializedName("query")
@Expose
private Query query;
/**
*
* @return
* The query
*/
public Query getQuery() {
return query;
}
/**
*
* @param query
* The query
*/
public void setQuery(Query query) {
this.query = query;
}
}
查詢
public class Query {
@SerializedName("count")
@Expose
private Integer count;
@SerializedName("created")
@Expose
private String created;
@SerializedName("lang")
@Expose
private String lang;
@SerializedName("results")
@Expose
private Results results;
/**
*
* @return
* The count
*/
public Integer getCount() {
return count;
}
/**
*
* @param count
* The count
*/
public void setCount(Integer count) {
this.count = count;
}
/**
*
* @return
* The created
*/
public String getCreated() {
return created;
}
/**
*
* @param created
* The created
*/
public void setCreated(String created) {
this.created = created;
}
/**
*
* @return
* The lang
*/
public String getLang() {
return lang;
}
/**
*
* @param lang
* The lang
*/
public void setLang(String lang) {
this.lang = lang;
}
/**
*
* @return
* The results
*/
public Results getResults() {
return results;
}
/**
*
* @param results
* The results
*/
public void setResults(Results results) {
this.results = results;
}
}
報價
public class Quote {
@SerializedName("symbol")
@Expose
private String symbol;
public String getAsk() {
return ask;
}
public void setAsk(String ask) {
this.ask = ask;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
@SerializedName("Ask")
@Expose
private String ask;
}
結果
public class Results {
@SerializedName("quote")
@Expose
private Quote quote;
/**
*
* @return
* The quote
*/
public Quote getQuote() {
return quote;
}
/**
*
* @param quote
* The quote
*/
public void setQuote(Quote quote) {
this.quote = quote;
}
}
MainActivity
public class MainActivity extends Activity{
private static final String API_BASE_URL = "http://query.yahooapis.com/v1/public/";
private Call<ResultWrapper> call;
private ResultWrapper mResultWrapper;
private List<Quote> items;
private QuoteAdapter mQuoteAdapter;
private String symbol = "symbol";
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Random boolean used to generate Network error code by changing Stack Overflow API version
//random = new Random();
//if (random.nextBoolean()){
// version = "2.2";
//} else {
// version = "fail";
//}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
mQuoteAdapter = new QuoteAdapter(items);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.question_list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(mQuoteAdapter);
StockApiServiceInterface stockApiServiceInterface = retrofit.create(StockApiServiceInterface.class);
call = stockApiServiceInterface.listQuotes(symbol);
call.enqueue(new Callback<ResultWrapper>() {
@Override public void onResponse(Response<ResultWrapper> response) {
try {
mResultWrapper = response.body();
items = mResultWrapper.getQuery().getResults().getQuote();
//questionsAdapter.swapList(items);
} catch (NullPointerException e){
Toast toast = null;
if (response.code() == 401){
toast = Toast.makeText(MainActivity.this, "Unauthenticated", Toast.LENGTH_SHORT);
} else if (response.code() >= 400){
toast = Toast.makeText(MainActivity.this, "Client Error " + response.code()
+ " " + response.message(), Toast.LENGTH_SHORT);
}
toast.show();
}
}
@Override public void onFailure(Throwable t) {
Log.e("listQuotes threw: ", t.getMessage());
}
});
}
@Override protected void onStop() {
super.onStop();
// Unsubscribe
call.cancel();
}
@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);
}
}
activity_main.xml中
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/question_list"/>
</FrameLayout>
question_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/question_item"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:id="@+id/title"/>
</LinearLayout>
感謝您的及時答覆,我改變了我的StockAPIService按照你的建議。現在只是想知道我在onResponse()中添加了什麼:call = stockApiServiceInterface.listQuotes( 「select * from yahoo.finance.quotes where symbol in(\」YHOO \「)」, 「store://datatables.org/ ())getQuery()。getResults()。getQuote (); //什麼代碼應該去這裏? } –
@ D.Ace只需用請求主體的數據更新UI或者存儲數據供以後使用 – larsgrefer
嗨我今天測試過了,它沒有返回正確的url。its returns this:http://query.yahooapis.com/yql?format=json&callback=&q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol% 20英寸20%(%22YHOO%22)&ENV =商店://datatables.org/alltableswithkeys –