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

3pvhb19x  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(301)

我正在尝试从我的sql数据库中获取页面文本,并在android fragment的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);
}
}
lnlaulya

lnlaulya1#

出于您的目的,“getdata”方法必须同步工作。但你的代码不是。
为确保正确工作,请将“getdata”方法修改为“work synchronized”,或在“onresponse”方法之后调用“settext”方法。

tgabmvqs

tgabmvqs2#

删除pagetext变量并在响应时设置textview

pw136qt2

pw136qt23#

让我们来分析一下:

final TextView textView = root.findViewById(R.id.text_home);

    getData("1");
    textView.setText(pageText);

你说pagetext是 null 什么时候 setText 被称为。那么让我们看看 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 还没定下来。噢。
但我不认为你能等回复后再从医院回来 getData . 这会阻塞ui线程。所以我认为你需要做的是把调用 textView.setText 进入听者的React onResponse 方法。

相关问题