Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java setText在while循环中不工作_Java_Android_Android Layout - Fatal编程技术网

Java setText在while循环中不工作

Java setText在while循环中不工作,java,android,android-layout,Java,Android,Android Layout,我的应用程序从一个API获取流量更新(这是可行的),并返回一个JSON数组,然后我在while循环(JSONobject)中获取其中的每个元素,并尝试每5秒用每个结果更新一个TextView 但是,我的脚本正在等待15秒,然后更新到最后一个值。我做了一些研究,它说要使用asynctask,我也做过,但没有什么不同 我已经添加了System.out.println(字符串到更新到),这正按照我希望我的应用程序的方式工作(每5秒更改一次) 以下内容位于try/catch块中: JSONArray T

我的应用程序从一个API获取流量更新(这是可行的),并返回一个JSON数组,然后我在while循环(JSONobject)中获取其中的每个元素,并尝试每5秒用每个结果更新一个TextView

但是,我的脚本正在等待15秒,然后更新到最后一个值。我做了一些研究,它说要使用asynctask,我也做过,但没有什么不同

我已经添加了
System.out.println(字符串到更新到)
,这正按照我希望我的应用程序的方式工作(每5秒更改一次)

以下内容位于try/catch块中:

JSONArray TrafficInformation = new JSONArray(response);

int TrafficEvents = TrafficInformation.length();
int TrafficEvent = 0;

JSONObject CurrentEvent = new JSONObject();

do{
    CurrentEvent = new JSONObject(TrafficInformation.getString(TrafficEvent));

    TextView affected_route = (TextView)findViewById(R.id.disrupted_route);

    try {
        Object[] passTo = new Object[1];
        passTo[0] = CurrentEvent.getString("9");

        System.out.println(passTo[0]);

        new tasker().doInBackground(passTo);

        TrafficEvent++;
        Thread.sleep(5000);
    } catch (Exception e){
        Toast.makeText(LiftShare.this, "There was an error with getting traffic info.", Toast.LENGTH_LONG).show();
    }
} while (TrafficEvent < TrafficEvents);
这是代码中的JSONArray(格式正确)

如何使textview每5秒更新一次新值?

您必须使用

new tasker().execute(passTo);
要以线程的形式启动
asynctask
,否则,在当前的实现中,它将只是作为一个普通的方法调用

注意:您不能从后台线程(即
doInBackground
内部)更新UI,而是覆盖在UI线程上运行的
onPostExecute

@Override
protected Object[] doInBackground(Object[] Objects) {
    TextView affected_route = (TextView)findViewById(R.id.disrupted_route);
    //affected_route.setText(Objects[0].toString()); crash, instead do this in onPostExecute

    return null;
};
更新:您可以使用带有延迟的
postDelayed
在一段时间后更新UI

int i = 0;
affected_route.postDelayed(new Runnable() {
    public void run() {
        textView.setText(yourText);
    }
},i+=5000);
你必须使用

new tasker().execute(passTo);
要以线程的形式启动
asynctask
,否则,在当前的实现中,它将只是作为一个普通的方法调用

注意:您不能从后台线程(即
doInBackground
内部)更新UI,而是覆盖在UI线程上运行的
onPostExecute

@Override
protected Object[] doInBackground(Object[] Objects) {
    TextView affected_route = (TextView)findViewById(R.id.disrupted_route);
    //affected_route.setText(Objects[0].toString()); crash, instead do this in onPostExecute

    return null;
};
更新:您可以使用带有延迟的
postDelayed
在一段时间后更新UI

int i = 0;
affected_route.postDelayed(new Runnable() {
    public void run() {
        textView.setText(yourText);
    }
},i+=5000);

AsyncTask
对于您的需求来说似乎有些过分,因为您并没有真正在后台做任何工作。您可以使用
处理程序
(来自
android.os
)安排文本在一段时间后更新,如下所示:

Handler handler = new Handler(Looper.getMainLooper());
    Runnable textUpdater = new Runnable() {
        @Override
        public void run() {
            // this needs to execute in the UI thread
            affected_route.setText(lastUpdate);
        }
    };
    String lastUpdate = "Store your last update here";

    void updateText(){
        handler.postDelayed(textUpdater, 5000);
    }

AsyncTask
对于您的需求来说似乎有些过分,因为您并没有真正在后台做任何工作。您可以使用
处理程序
(来自
android.os
)安排文本在一段时间后更新,如下所示:

Handler handler = new Handler(Looper.getMainLooper());
    Runnable textUpdater = new Runnable() {
        @Override
        public void run() {
            // this needs to execute in the UI thread
            affected_route.setText(lastUpdate);
        }
    };
    String lastUpdate = "Store your last update here";

    void updateText(){
        handler.postDelayed(textUpdater, 5000);
    }

交通信息代码在哪里运行?这是背景线吗?如果是,是谁启动的,何时启动?交通信息代码在哪里运行?这是背景线吗?如果是,是谁启动的,何时启动?感谢您的编辑,我正要评论UI错误,将重试。我如何进行后期执行?@HarveyFletcher,方法是执行
Thread.sleep(5000)
您正在主线程中添加延迟我认为不需要
asynctask
它很容易实现,无需
asynctask
我说的对吗@Pavneet_Singh?感谢您的帮助,更新后的延迟已经修复了它。感谢编辑,我正要评论UI错误,将再试一次。如何进行后期执行?@HarveyFletcher通过执行
Thread.sleep(5000)
您正在主线程中添加延迟我认为不需要
asynctask
它很容易实现,无需
asynctask
我说的对吗@Pavneet_Singh?感谢您的帮助,更新后的延迟已经修复。