Android线程解释?

时间:2014-03-28 03:28:36

标签: java android multithreading

很抱歉所有人都被问过几次,但我只是不明白任何答案,因为大多数是关于定时的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应用程序刚丢失。谢谢你的帮助。

2 个答案:

答案 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。