我正在尝试从我的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);
}
}
3条答案
按热度按时间lnlaulya1#
出于您的目的,“getdata”方法必须同步工作。但你的代码不是。
为确保正确工作,请将“getdata”方法修改为“work synchronized”,或在“onresponse”方法之后调用“settext”方法。
tgabmvqs2#
删除pagetext变量并在响应时设置textview
pw136qt23#
让我们来分析一下:
你说pagetext是
null
什么时候setText
被称为。那么让我们看看getData
做:所以。。。
getData
使用响应侦听器和错误处理程序准备请求,将其添加到请求队列,然后立即返回。一段时间后,发送请求并接收响应。然后
onResponse
方法,对json进行解析并pageText
设置为(可能)非空值。但问题是。一旦
getData
呼叫返回时,呼叫方执行以下操作:很可能对请求的响应还没有到达,而且
pageText
还没定下来。噢。但我不认为你能等回复后再从医院回来
getData
. 这会阻塞ui线程。所以我认为你需要做的是把调用textView.setText
进入听者的ReactonResponse
方法。