Java setText在while循环中不工作
我的应用程序从一个API获取流量更新(这是可行的),并返回一个JSON数组,然后我在while循环(JSONobject)中获取其中的每个元素,并尝试每5秒用每个结果更新一个TextView 但是,我的脚本正在等待15秒,然后更新到最后一个值。我做了一些研究,它说要使用asynctask,我也做过,但没有什么不同 我已经添加了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
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?感谢您的帮助,更新后的延迟已经修复。