同步无法在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 (将#修改为@)