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

Java 如何使用onResponse json函数更改android片段中的公共字符串值,java,android,android-fragments,Java,Android,Android Fragments,我试图从我的SQL数据库中获取页面文本,并在Android片段的TextView中显示它 我得到了数据,但当我试图将其解析为公共字符串时,结果为空 我创建了公共字符串pageText和uset setText(pageText),并尝试将json文本解析为pageText,但结果为空,并且没有在TextView中显示页面文本 这是我的密码: package per.mikha.programs.medjobs.ui.home; import android.app.VoiceInteract

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

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

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

这是我的密码:

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

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

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.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.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);
}
}
package per.mikha.programs.medjobs.ui.home;
导入android.app.voiceinteractior;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.webkit.WebView;
导入android.widget.TextView;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModelProvider;
导入com.android.volley.Request;
导入com.android.volley.RequestQueue;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.JsonObjectRequest;
导入com.android.volley.toolbox.StringRequest;
导入com.android.volley.toolbox.volley;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.w3c.dom.Text;
导入java.io.IOException;
导入java.lang.reflect.Method;
根据.mikha.programs.medjobs.R导入;
公共类HomeFragment扩展了片段{
私有HomeViewModel HomeViewModel;
公共字符串页面文本;
公共最终字符串GET_BY_ID=”https://xxxxxx.com/mekha.php?id=";
公共视图onCreateView(@NonNull layoutiner充气机,
视图组容器,捆绑包savedInstanceState){
homeViewModel=
新建ViewModelProvider(this.get)(HomeViewModel.class);
视图根=充气机。充气(R.layout.fragment\u home,container,false);
final TextView TextView=root.findviewbyd(R.id.text\u home);
getData(“1”);
textView.setText(页面文本);
//Toast.makeText(getContext(),pageText,Toast.LENGTH_LONG).show();
/*homeViewModel.getText().observe(getViewLifecycleOwner(),new Observer()){
@凌驾
公共void onChanged(@Nullable String s){
textView.setText;
}
});*/
返回根;
}
public void getData(字符串id){
JsonObjectRequest=newJSONObjectRequest(request.Method.GET,GET_BY_ID+ID,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
String title=response.getString(“title”);
String theText=response.getString(“文本”);
pageText=文本;
//Toast.makeText(getContext(),theText,Toast.LENGTH_LONG.show();
}捕获(JSONException e){
e、 printStackTrace();
Toast.makeText(getContext(),e.getMessage(),Toast.LENGTH_LONG.show();
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG.show();
}
});
RequestQueue requestQuere=Volley.newRequestQueue(getContext());
requestQuere.add(请求);
}
}
让我们把它分开:

    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);
}
很可能对请求的响应尚未到达,并且
pageText
尚未设置。哎呀


但我认为您不能等待响应后再从
getData
返回。这将阻塞UI线程。因此,我认为您需要做的是将调用
textView.setText
的代码放入响应侦听器的
onResponse
方法中。

删除pagetext变量并设置textView on response

出于您的目的,“getData”方法必须同步工作。但您的代码不是。
若要确保正确工作,请将“getData”方法修改为同步工作,或在“onResponse”方法之后调用“setText”方法

    textView.setText(pageText);