有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用onResponse json函数更改安卓片段中的公共字符串值

我试图从我的SQL数据库中获取页面文本,并在Android Fragment的TextView中显示它

我得到了数据,但当我试图将其解析为公共字符串时,结果为空

我创建了公共字符串pageText和uset setText(pageText),并尝试将json文本解析为pageText,但结果为空,并且没有在TextView中显示页面文本

这是我的代码:

 package per.mikha.programs.medjobs.ui.home;

import 安卓.app.VoiceInteractor;
import 安卓.os.Bundle;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.webkit.WebView;
import 安卓.widget.TextView;
import 安卓.widget.Toast;

import 安卓x.annotation.NonNull;
import 安卓x.annotation.Nullable;
import 安卓x.fragment.app.Fragment;
import 安卓x.lifecycle.Observer;
import 安卓x.lifecycle.ViewModelProvider;

import com.安卓.volley.Request;
import com.安卓.volley.RequestQueue;
import com.安卓.volley.Response;
import com.安卓.volley.VolleyError;
import com.安卓.volley.toolbox.JsonObjectRequest;
import com.安卓.volley.toolbox.StringRequest;
import com.安卓.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

import java.io.IOException;
import java.lang.reflect.Method;

import per.mikha.programs.medjobs.R;

public class HomeFragment extends Fragment {

    private HomeViewModel homeViewModel;
    public String pageText;
    public final String GET_BY_ID = "https://xxxxxx.com/mekha.php?id=";


    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        homeViewModel =
                new ViewModelProvider(this).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        final TextView textView = root.findViewById(R.id.text_home);

        getData("1");
        textView.setText(pageText);
        //Toast.makeText(getContext(),pageText,Toast.LENGTH_LONG).show();

        /*homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });*/
        return root;

    }

    public void getData(String id){
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, GET_BY_ID+id, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
       

     try {
                String title = response.getString("title");
                String theText = response.getString("text");
                pageText=theText;
                //Toast.makeText(getContext(),theText,Toast.LENGTH_LONG).show();
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getContext(),e.getMessage(),Toast.LENGTH_LONG).show();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
        }
    });

    RequestQueue requestQuere = Volley.newRequestQueue(getContext());
    requestQuere.add(request);
}
}

共 (1) 个答案

  1. # 1 楼答案

    让我们把它分开:

        final TextView textView = root.findViewById(R.id.text_home);
    
        getData("1");
        textView.setText(pageText);
    

    setText被调用时,你说pageText是null。那么让我们看看getData做了什么:

    public void getData(String id){
        JsonObjectRequest request = 
                new JsonObjectRequest(
                    Request.Method.GET, GET_BY_ID+id, null, 
                    new Response.Listener<JSONObject>() {
                         @Override
                         public void onResponse(JSONObject response) {
                             try {
                                 String title = response.getString("title");
                                 String theText = response.getString("text");
                                 pageText = theText;
                             } catch (JSONException e) {
                                 // ...
                             }
                        }
                   }, 
                   new Response.ErrorListener() {
                        // ...
                   }
        );
        RequestQueue requestQueue = Volley.newRequestQueue(getContext());
        requestQueue.add(request);
    }
    

    所以getData使用响应侦听器和错误处理程序准备请求,将其添加到请求队列,然后立即返回

    一段时间后,发送请求并接收响应。然后调用onResponse方法,解析JSON,并将pageText设置为(大概)非空值

    但问题是。只要getData调用返回,调用方就会执行以下操作:

        textView.setText(pageText);
    

    很可能对请求的响应还没有到达,而且pageText还没有设置好。哎呀

    但我不认为你能在从^{返回之前等待回复。这会阻塞UI线程。所以我认为您需要做的是将调用textView.setText的代码放入响应侦听器的onResponse方法中