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 楼答案
让我们把它分开:
当
setText
被调用时,你说pageText是null
。那么让我们看看getData
做了什么:所以
getData
使用响应侦听器和错误处理程序准备请求,将其添加到请求队列,然后立即返回一段时间后,发送请求并接收响应。然后调用
onResponse
方法,解析JSON,并将pageText
设置为(大概)非空值但问题是。只要
getData
调用返回,调用方就会执行以下操作:很可能对请求的响应还没有到达,而且
pageText
还没有设置好。哎呀但我不认为你能在从^{返回之前等待回复。这会阻塞UI线程。所以我认为您需要做的是将调用
textView.setText
的代码放入响应侦听器的onResponse
方法中