首页 > 解决方案 > 按下后退按钮时将 JSON 解析为数组不起作用

问题描述

我在我的 Android Studio 应用程序中遇到了与按下后退按钮有关的问题。基本上,用户输入文本视图和另一种方法(不包括在内,因为它工作正常,但我可以根据要求发布)搜索 API 以获取相关数据并将其显示在回收站视图中。然后用户从回收器视图中进行选择,下面的方法解析一个 JSON 文件,并将其中的相关数据添加到一个单独的类“Director”中的一个数组中。一旦发生这种情况,下一个活动“GraphActivity”就会启动并在画布上为数组中的每个导向器绘制多个节点。

我遇到的问题是,当我在文本视图中输入内容,然后按后退按钮关闭我的 Android 设备上的软键盘(它覆盖了回收器视图)并完成我刚才提到的步骤时, GraphActivity 活动启动它不起作用(没有绘制节点)。但是,如果我然后按后退按钮返回到第一个活动,然后再次从回收站视图中进行相同的选择,它就可以工作。

据我所知,问题似乎与添加到“Director”数组的数据有关,但我无法弄清楚是什么原因造成的,Logcat 显示 GraphActivity 活动第一次启动“Director”数组时为空并且因此,没有绘制任何节点,但是当我按下并再次进行相同的选择时,数组具有正确的数据并绘制了节点。

我非常感谢您对此的帮助,因为我对 Android Studio 非常陌生,并且一直在寻找几个小时来尝试找到解决方案。

public class MainActivity extends AppCompatActivity implements MainAdapter.OnCompanyClickedListener {
    private RecyclerView recyclerView;
    private TextView userInput;
    private Button search;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.rView);
        RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(manager);

    }

    //Parse JSON File
    public void searchCompanyDirectors(final String companyNumber){
    Thread thread = new Thread(new Runnable(){
        @Override
        public void run(){
            HttpClient httpClient = new HttpClient();
            try{
                final String response = httpClient.run("myURL");
                runOnUiThread(new Runnable(){
                    @Override
                    public void run(){
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray array = jsonObject.getJSONArray("items");
                            for (int i = 0; i < array.length();i++){
                                JSONObject o = array.getJSONObject(i);
                                String appointment = o.getString("links");
                                String parsedAppointment = parseApp(appointment);

                                Director director = new Director(o.getString("name"),parsedAppointment);

                                Director.directorList.add(director);
                            }

                        }catch (JSONException e){
                            e.printStackTrace();
                        }
                    }
                });
            }
            catch (Exception ex){
                ex.printStackTrace();
            }
        }
    });
    thread.start();
  }

    @Override
    public void onCompanyClicked(int position) {
        Toast.makeText(this,Company.companyList.get(position).getTitle(),Toast.LENGTH_LONG).show();
        chosenCompanyNumber = Company.companyList.get(position).getCompanyNumber();
        chosenCompany = Company.companyList.get(position).getTitle();
        searchCompanyDirectors(chosenCompanyNumber);
        Intent intent = new Intent(this,GraphActivity.class);
        startActivity(intent);
    }
 }

GraphActivity 类:

public class GraphActivity extends AppCompatActivity {
DrawGraph drawGraph;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    drawGraph = new DrawGraph(this);
    setContentView(drawGraph);

DrawGraph 类:

public class DrawGraph extends View {

private Paint p1;
private Paint p2;
private Paint p3;
private Paint paint;

private Path path;
private Point point1;

private int radius = 300;
double x;
double y;
double angle;

int mWidth = this.getResources().getDisplayMetrics().widthPixels;
int mHeight = this.getResources().getDisplayMetrics().heightPixels;

List<Director> directorList = Director.getDirectorList();
private String chosenCompany = MainActivity.getChosenCompany();
private static List<Float> ordinates = new ArrayList<>();

public DrawGraph(Context context) {
    super(context);
    p1 = new Paint(Paint.ANTI_ALIAS_FLAG);
    p1.setStrokeWidth(10);
    p2 = new Paint(Paint.ANTI_ALIAS_FLAG);
    p2.setStrokeWidth(10);
    p3 = new Paint(Paint.ANTI_ALIAS_FLAG);
    p3.setStrokeWidth(5);
    path = new Path();
    paint = new Paint();
    point1 = new Point(mWidth/2, mHeight/2);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // Colors
    p1.setStyle(Paint.Style.FILL);
    p1.setColor(Color.RED);
    p2.setStyle(Paint.Style.FILL);
    p2.setColor(Color.GREEN);
    p3.setStyle(Paint.Style.STROKE);
    p3.setColor(Color.CYAN);
    paint.setColor(Color.BLACK);
    paint.setTextSize(18f);
    paint.setAntiAlias(true);
    paint.setTextAlign(Paint.Align.CENTER);
    Rect bounds = new Rect();
    paint.getTextBounds(chosenCompany, 0, chosenCompany.length(),bounds);

    //Draw company and directors
    for (int i = 1; i <= directorList.size(); i++)
    {
        //Divide the company node
        angle = i * (360/directorList.size());
        x = point1.x + radius * cos(angle);
        y = point1.y + radius * sin(angle);

        //Draw directors
        canvas.drawCircle((float)x,(float)y - (bounds.height() / 2), bounds.width() + 5,p2);
        canvas.drawText(directorList.get(i-1).getName(),(float)x,(float)y,paint);
    }

标签: javaandroidarraysjson

解决方案


好的,我在此处指出的 DrawGraph 类中发现了一个问题;

List<Director> directorList = Director.getDirectorList();
private String chosenCompany = MainActivity.getChosenCompany();

您不应该直接从另一个活动访问一个活动的数据对象。根据 Android OS 及其生命周期,之前的活动可能会被销毁等。你必须把它想象成看不见,不在记忆中;这可能导致当前活动无法访问前一个活动中的数据。

您需要将 JSON 文件中的解析数据、变量 List directorList 和 String selectedCompany 从 MainActivity 正确发送到 GraphActivity。

您可以将数据从一个活动发送到另一个活动,方法是将其添加到调用下一个活动的意图中。Intent 类具有帮助您通过自身发送少量信息的功能;称为 putExtra() 和 getExtra()。更多关于他们在这里

您将需要通过 intent.putExtra 添加这些变量数据集,并使用 getExtras 在您的其他活动 onCreate 中将它们取回。

活动 A >> 对活动 B + 数据的意图调用 >> 活动 B

希望这可以帮助。


推荐阅读