Android 使用UI线程加载新的JSON值

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

我在更新从json文件中获取的新值时遇到了一个问题(假设任何值为5秒或任意值)。我已经开发了这段代码,现在我陷入了这一困境。当我运行此代码时,它显示第二次运行后的值在第二次运行时没有得到更新。我已经实现了处理程序,但它在这里也不起作用。我曾经使用过UI线程,但在使用它的过程中我又遇到了问题

    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传递给异步任务