Android 使用UI线程加载新的JSON值
我在更新从json文件中获取的新值时遇到了一个问题(假设任何值为5秒或任意值)。我已经开发了这段代码,现在我陷入了这一困境。当我运行此代码时,它显示第二次运行后的值在第二次运行时没有得到更新。我已经实现了处理程序,但它在这里也不起作用。我曾经使用过UI线程,但在使用它的过程中我又遇到了问题Android 使用UI线程加载新的JSON值,android,json,Android,Json,我在更新从json文件中获取的新值时遇到了一个问题(假设任何值为5秒或任意值)。我已经开发了这段代码,现在我陷入了这一困境。当我运行此代码时,它显示第二次运行后的值在第二次运行时没有得到更新。我已经实现了处理程序,但它在这里也不起作用。我曾经使用过UI线程,但在使用它的过程中我又遇到了问题 public class MainActivity extends AppCompatActivity { TextView a,b,c,d,e,f,g,h; String resul
public class MainActivity extends AppCompatActivity {
TextView a,b,c,d,e,f,g,h;
String result = "";
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a=(TextView) findViewById(R.id.a);
b=(TextView) findViewById(R.id.b);
c=(TextView) findViewById(R.id.c);
Runnable hand = new Runnable() {
@Override
public void run() {
DownloadTask task = new DownloadTask();
task.execute("https://api.thingspeak.com/channels/12345/feeds.json?results=1");
}
};
new Thread(hand).start();
}
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
}
@Override
protected void onPostExecute(final String result) {
super.onPostExecute(result);
Runnable handa = new Runnable() {
@Override
public void run() {
search(result);
}
};
new Thread(handa).start();
}
public void search(String result){
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray weatherInfo = jsonObject.getJSONArray("feeds");
JSONObject legsobject = weatherInfo.getJSONObject(0);
final String field1 = legsobject.getString("field1");
final String field2 = legsobject.getString("field2");
final String field3 = legsobject.getString("field3");
Thread.sleep(1000);
mHandler.post(new Runnable() {
@Override
public void run() {
a.setText(field1);
b.setText(field2);
c.setText(field3);
}
});
}
}
}
public类MainActivity扩展了AppCompatActivity{
文本视图a、b、c、d、e、f、g、h;
字符串结果=“”;
Handler mHandler=新的Handler();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a=(TextView)findViewById(R.id.a);
b=(TextView)findViewById(R.id.b);
c=(TextView)findViewById(R.id.c);
Runnable hand=new Runnable(){
@凌驾
公开募捐{
DownloadTask任务=新建DownloadTask();
任务。执行(“https://api.thingspeak.com/channels/12345/feeds.json?results=1");
}
};
新螺纹(手动)。开始();
}
公共类DownloadTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
网址;
HttpURLConnection-urlConnection=null;
试一试{
url=新url(url[0]);
urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=urlConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1){
当前字符=(字符)数据;
结果+=电流;
data=reader.read();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(最终字符串结果){
super.onPostExecute(结果);
Runnable handa=新的Runnable(){
@凌驾
公开募捐{
搜索(结果);
}
};
新线程(handa.start();
}
公共无效搜索(字符串结果){
试一试{
JSONObject JSONObject=新JSONObject(结果);
JSONArray weatherInfo=jsonObject.getJSONArray(“提要”);
JSONObject legsobject=weatherInfo.getJSONObject(0);
final String field1=legsobject.getString(“field1”);
final String field2=legsobject.getString(“field2”);
final String field3=legsobject.getString(“field3”);
睡眠(1000);
mHandler.post(新Runnable(){
@凌驾
公开募捐{
a、 setText(字段1);
b、 setText(字段2);
c、 setText(字段3);
}
});
}
}
}
我是Android初学者,正在尝试练习。需要您的帮助。您的指导将帮助我了解更多信息。请尝试这个
public class MainActivity extends AppCompatActivity {
TextView a,b,c,d,e,f,g,h;
String result = "";
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a=(TextView) findViewById(R.id.a);
b=(TextView) findViewById(R.id.b);
c=(TextView) findViewById(R.id.c);
DownloadTask task = new DownloadTask();
task.execute("https://api.thingspeak.com/channels/12345/feeds.json?results=1");
}
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
}
@Override
protected void onPostExecute(final String result) {
super.onPostExecute(result);
search(result);
}
public void search(String result){
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray weatherInfo = jsonObject.getJSONArray("feeds");
JSONObject legsobject = weatherInfo.getJSONObject(0);
final String field1 = legsobject.getString("field1");
final String field2 = legsobject.getString("field2");
final String field3 = legsobject.getString("field3");
a.setText(field1);
b.setText(field2);
c.setText(field3);
}
}
}
public类MainActivity扩展了AppCompatActivity{
文本视图a、b、c、d、e、f、g、h;
字符串结果=”;
Handler mHandler=新的Handler();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a=(TextView)findViewById(R.id.a);
b=(TextView)findViewById(R.id.b);
c=(TextView)findViewById(R.id.c);
DownloadTask任务=新建DownloadTask();
任务。执行(“https://api.thingspeak.com/channels/12345/feeds.json?results=1");
}
公共类DownloadTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
网址;
HttpURLConnection-urlConnection=null;
试一试{
url=新url(url[0]);
urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=urlConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1){
当前字符=(字符)数据;
结果+=电流;
data=reader.read();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(最终字符串结果){
super.onPostExecute(结果);
搜索(结果);
}
公共无效搜索(字符串结果){
试一试{
JSONObject JSONObject=新JSONObject(结果);
JSONArray weatherInfo=jsonObject.getJSONArray(“提要”);
JSONObject legsobject=weatherInfo.getJSONObject(0);
final String field1=legsobject.getString(“field1”);
final String field2=legsobject.getString(“field2”);
final String field3=legsobject.getString(“field3”);
a、 setText(字段1);
b、 setText(字段2);
c、 setText(字段3);
}
}
}
只需从onPostExecute中删除线程,并在doInBackground本身中添加逻辑,然后从doInBackground返回JsonObject。FYI onPostExecute在UI/主线程中运行。另外,您不需要将asyncTask包装在线程中。FYI doInBackground在后台线程中运行,与其他方法在主线程上运行一样,您能告诉我它在哪里运行吗s刷新?您已经创建了mHandler对象,但没有将其传递给asyntask,也没有使用它来使用数据。因此,我只是忽略了handler对象,并删除了代码中的线程。因此它可以工作。或者,您也可以将handler传递给异步任务