如何解决同步无法在JsonObject的onResponse中工作
我在同步方面遇到问题,我将单例用于requestQueue,也确实使用了回调,也使用了findprocessprocess(),后者是CurrencyAsyncResponse接口的一种方法。 getCurrencies()方法只是返回一个空列表,但是如果我在processFinished中使用currencyArrayList可以正常工作, 但在processFinished之外,此数组列表为空
主要活动
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolBox.JsonObjectRequest;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import adapter.CurrencyAdapter;
import data.Currency;
import data.CurrencyAsyncResponse;
import data.CurrencyBank;
import data.CurrencyItem;
import model.MySingleton;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText number1EditText;
private EditText number2EditText;
private Button convertButton;
private List<Currency> currencies;
private TextView test;
private Spinner spinner1;
private Spinner spinner2;
private ArrayList<String> ratesName;
private ArrayList<CurrencyItem> mCountryList;
private int currentIndexSelectedFrom = 0;
private int currentIndexSelectedTo = 0;
private CurrencyAdapter mAdapter;
private String url = "http://data.fixer.io/api/latest?access_key=7ac07473c0c0b47b6a93ecd209e90f07";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget();
setData();
}
private void setData() {
currencies = new CurrencyBank().getCurrencies(this,new CurrencyAsyncResponse() {
@Override
public void processFinished(ArrayList<Currency> currencyArrayList) {
for (int i = 0; i < currencies.size(); i++) {
ratesName.add(currencies.get(i).getcName());
mCountryList.add(new CurrencyItem(currencies.get(i).getcName(),R.drawable.ic_launcher_background));
Log.d("TAG","setData: " + currencies.get(i).getcName() + " " + ratesName.get(i));
}
}
});
mAdapter = new CurrencyAdapter(this,mCountryList);
mAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinner1.setAdapter(mAdapter);
// spinner2.setAdapter(mAdapter);
spinner1.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView,View view,int i,long l) {
currentIndexSelectedFrom = i;
Log.d("TAG","onItemSelected: you selected " + adapterView.getItemAtPosition(i).toString());
}
@Override
public void onnothingSelected(AdapterView<?> adapterView) {
}
});
// spinner2.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// @Override
// public void onItemSelected(AdapterView<?> adapterView,long l) {
// currentIndexSelectedTo = adapterView.getSelectedItemPosition();
// Toast.makeText(MainActivity.this,""+ adapterView.getItemIdAtPosition(i),Toast.LENGTH_SHORT).show();
//
// Log.d("TAG","onItemSelected: " + i + " " + adapterView.getItemAtPosition(i).toString());
// }
//
// @Override
// public void onnothingSelected(AdapterView<?> adapterView) {
//
// }
// });
mAdapter.notifyDataSetChanged();
}
void initWidget() {
test = findViewById(R.id.test);
number1EditText = findViewById(R.id.editTextNumber);
number2EditText = findViewById(R.id.editTextNumber2);
convertButton = findViewById(R.id.convert_btn);
mCountryList = new ArrayList<>();
spinner1 = findViewById(R.id.rate_spinner1);
spinner2 = findViewById(R.id.rate_spinner2);
ratesName = new ArrayList<>();
convertButton.setonClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.convert_btn:
convert();
break;
}
}
private void convert() {
double num1;
double num2;
double first = currencies.get(currentIndexSelectedFrom).getcRate();
double second = currencies.get(currentIndexSelectedTo).getcRate();
Log.d("TAG","convert: " + first + " " + currentIndexSelectedFrom +
second + " " + currentIndexSelectedTo);
if (TextUtils.isEmpty(number1EditText.getText()) && TextUtils.isEmpty(number2EditText.getText())) {
Toast.makeText(this,"Enter a number in one of the above field",Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(number1EditText.getText())) {
num2 = Double.parseDouble(number2EditText.getText().toString());
double sum = (first * num2) / second;
number1EditText.setText(sum + "");
} else {
num1 = Double.parseDouble(number1EditText.getText().toString());
double sum = (num1 * second) / first;
number2EditText.setText(sum + "");
}
}
}
这是我的界面CurrencyAsyncResponse
import java.util.ArrayList;
public interface CurrencyAsyncResponse {
void processFinished(ArrayList<Currency> currencyArrayList);
}
这是我的currencyBank类,我使用CurrencyAsyncResponse与json对象同步数据
import android.app.Application;
import android.app.ApplicationErrorReport;
import android.app.DownloadManager;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolBox.JsonArrayRequest;
import com.android.volley.toolBox.JsonObjectRequest;
import com.android.volley.toolBox.Volley;
import com.example.currencyexchange.MainActivity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import model.MySingleton;
public class CurrencyBank {
ArrayList<Currency> currencyArrayList = new ArrayList<>();
private String url = "http://data.fixer.io/api/latest?access_key=7ac07473c0c0b47b6a93ecd209e90f07";
public List<Currency> getCurrencies(Context context,final CurrencyAsyncResponse callBack) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject jsonObject = response.getJSONObject("rates");
Iterator keysTocopyIterator = jsonObject.keys();
ArrayList<String> keysList = new ArrayList<String>();
while (keysTocopyIterator.hasNext()) {
String key = (String) keysTocopyIterator.next();
Currency currency = new Currency();
currency.setcName(key);
currency.setcRate(Double.parseDouble(jsonObject.getString(key)));
keysList.add(key);
currencyArrayList.add(currency);
}
} catch (JSONException e) {
e.printstacktrace();
}
if( null != callBack){
callBack.processFinished(currencyArrayList);
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);
return currencyArrayList;
}
}
单人班
package model;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolBox.ImageLoader;
import com.android.volley.toolBox.Volley;
public class MySingleton {
private static MySingleton instance;
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private static Context ctx;
private MySingleton(Context context) {
ctx = context;
requestQueue = getRequestQueue();
imageLoader = new ImageLoader(requestQueue,new ImageLoader.ImageCache() {
private final LruCache<String,Bitmap>
cache = new LruCache<String,Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url,Bitmap bitmap) {
cache.put(url,bitmap);
}
});
}
public static synchronized MySingleton getInstance(Context context) {
if (instance == null) {
instance = new MySingleton(context);
}
return instance;
}
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
// getApplicationContext() is key,it keeps you from leaking the
// Activity or broadcastReceiver if someone passes one in.
requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
return requestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getimageLoader() {
return imageLoader;
}
}
这是我在货币库中使用的货币类
package data;
import java.sql.Time;
import java.util.Date;
public class Currency {
private String cName;
private double cRate;
private Time cTime;
private Date cDate;
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public double getcRate() {
return cRate;
}
public void setcRate(double cRate) {
this.cRate = cRate;
}
public Time getcTime() {
return cTime;
}
public void setcTime(Time cTime) {
this.cTime = cTime;
}
public Date getcDate() {
return cDate;
}
public void setcDate(Date cDate) {
this.cDate = cDate;
}
public Currency() {
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。