我有以下示例代码来理解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。
答案 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了。 但从未想过以这种方式使用。
感谢你们俩