很抱歉所有人都被问过几次,但我只是不明白任何答案,因为大多数是关于定时的UI更新。所以我有一个backgroundTasks线程,当我的应用程序第一次启动时调用(网络连接是这样的......我认为你是怎么做的?)
public class MainActivity extends ActionBarActivity {
String data[][];
int arrayPosition = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runBackgroundTask();
}
这是我的话题..
public void runBackgroundTask(){
new Thread(new Runnable() {
public void run() {
data = pullSchedule(data);
updateUI(data,arrayPosition);
}
}).start();
}
所有这一切都是调用方法pullSchedule,它使用webcrawler更新2D数组。所以当我调用updateUI方法时,我的问题就来了,这个方法也被两个按钮用来循环遍历完全正常的数组数据。只是当线程首次运行时,如果我尝试更新UI,我会收到错误。
public void upDateUI(String data[][], int arrayPosition){
TextView gameTime =(TextView)findViewById(R.id.txtDate);
//more but deleted to save space :)
}
我已经研究过为什么我无法从后台线程更新UI,但我不明白如何解决这个问题?我考虑将整个方法放入runOnUiThread(new Runnable()
但我相信我的数据和arrayPosition必须被声明为最终因为内部类...第一个Android应用程序刚丢失。谢谢你的帮助。
答案 0 :(得分:0)
你走在正确的轨道上。您的应用崩溃的原因是您尝试从UI线程更新UI元素。为了避免这种情况,你可以像RichS建议的那样做,并使用AsyncTask,它将在UI线程上执行onPostExecute()
,或者使用updateUI()
在你的后台线程中围绕runOnUiThread(new Runnable() {...
调用。< / p>
答案 1 :(得分:0)
您可以使用asynctask来更新ui
public myAsyn extends AsyncTask<Void,Void,Void>
{
@Override
protected String doInBackground(Void... params) {
data = pullSchedule(data);
return null;
}
@Override
protected void onPostExecute(String result) {
updateUI(data,arrayPosition);
}
}
doInBackground
在单独的线程上运行,而onPostExecute
在Ui线程上运行,因此您可以从那里更新UI。