从Android中的线程更新视图

时间:2016-11-13 21:10:16

标签: android multithreading view android-5.0-lollipop

我有一个TextView的布局说 mainTextView

我的活动文件类似于:

public class SecondActivity extends AppCompatActivity {

    private static Integer i = 0;
    private TextView tv = null;


    @override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        tv = (TextView) findViewById(R.id.mainTextView);

        new MyThread().execute();
    }


    private void notifyAChange () {
        tv.setText(i.toString());
    }



    private class MyThread extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground (String... params) {

            while (true) {

                try {
                    i++;
                    Thread.sleep(1000);
                    notifyAChange();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这会在运行时返回 FATAL EXCEPTION 。我知道我不能触摸另一个线程的视图,除了原始视图,但是在那种情况下,我从主线程触摸视图,那么出了什么问题?

2 个答案:

答案 0 :(得分:1)

不,你在doInBackground(工作人员)的AsyncTask部分 您正在调用notifyAChange()表单工作线程,而不是主UI线程 您应该从onPostExecute更新用户界面。或者您也可以使用runOnUiThread来更新视图。

答案 1 :(得分:0)

主要使用asyncktask来执行长时间运行的任务所以有三种方法preExecute设置进度条,用于启动执行任务,doinbackground执行任务,如下载数据(主线程),后执行执行任务完成任务 您只能在使用asynctask时从Post执行更改UI组件。 有关asynktask的更多信息,请参阅https://developer.android.com/reference/android/os/AsyncTask.html  有关实施和说明,请参阅AsynkTask Implementation Update UI from Thread 你也可以使用RunonUI therad方法和Handler