TextView未按时更新

时间:2013-11-22 11:04:34

标签: android textview

我有以下示例代码来理解TextView更新

public class MainActivity extends Activity 
{
    int i=0;    
    private ImageButton btnMain;
    private TextView txtText;
    Context mycont=null;

    public void myJob(final String cmd)
    { 
        //txtText.setText(cmd);

        runOnUiThread(new Runnable() 
        {
            @Override
            public void run() {
                txtText.setText(cmd); //---Does not update the TextView here on Main UI
            }
        });     

        //----------- Long Work(Take around 15 seconds to complete) ----------
        for(i=0;i<=1000000000;i++)
        i++;                        

        for(i=0;i<=1000000000;i++)
        i++;
        //--------------------------------------------------------------------

        //---Update the TextView here once above Long work is executed
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        mycont=this;

        txtText = (TextView) findViewById(R.id.txtText);
        txtText.setMovementMethod(new ScrollingMovementMethod());


        btnMain = (ImageButton) findViewById(R.id.btnJob);          
        btnMain.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {   
                myJob("Display this msg");
            }
        });
    }
}

TextView没有及时更新,它等待其他程序执行。 请指出我正确的方向。我想在myJob()函数的开头更新TextView。

4 个答案:

答案 0 :(得分:1)

请看这个链接:How will UI changes be processed in the onClickListener before starting a new activity in Android?

“UI元素的更改不会立即执行。它们会在下次运行UI循环时执行,即在您释放控件之后执行。”

答案 1 :(得分:1)

我建议你研究一下AsyncTasks。它们允许您在执行耗时的工作之前和之后执行操作。在您的情况下,AsyncTask看起来有点像这样:

 private class LongJob extends AsyncTask<Void, Void, Void> {

    TextView textViewToChange;

    public LongJob(TextView text){
        textViewToChange = text;
    }

    protected void onPreExecute(){
    // Executed on main(UI) thread
        textViewToChange.setText("Some random text here");

    }

     protected Long doInBackground(Void... params) {
          // Your long job here, executed on background thread so 
          // it won't freeze your application.
         return null;
     }

     protected void onPostExecute(Void result) {
     // Executed on main(UI) thread
        textViewToChange.setText("Text for after your job completed");
     }
 }

答案 2 :(得分:0)

如果我理解正确,您想要更新textview,然后运行Long Work。在这种情况下,做这样的事情:

public void myJob(final String cmd)
{ 
    txtText.setText(cmd);

    txtText.post(new Runnable() {
        @Override
        public void run() {
            //----------- Long Work(Take around 15 seconds to complete) ----------
            for(i=0;i<=1000000000;i++)
            i++;                        

            for(i=0;i<=1000000000;i++)
            i++;
            //--------------------------------------------------------------------
        }
    });
}

注意:在任何一种情况下,您的长期工作都在UI线程上运行..因为您从未创建过后台任务

答案 3 :(得分:0)

感谢Amulya和Sander。 这两种解决方案都适合我。

但是根据我的需要,我会选择Amulya的轻量级解决方案。

我已经知道Android AsyncTasks了。 但从未想过以这种方式使用。

感谢你们俩