2011-03-08 50 views
0

我现在正在开发一个android应用程序,其中我需要在完成一些处理后显示文本。 我正在使用线程在后台运行进程,同时向用户显示进度对话框。该线程正常工作,我一步一步地跟着它,显然,它也很好;然而,我称它为止的方法似乎并没有结束(至少在正常循环中),因为我后来设置的文本会立即显示,我必须等待并执行其他一些操作(如按顺序它显示任务没有完成和禁止TextView被更新

下面是一块的,我遇到的麻烦代码:

private OnClickListener saldoDisp = new OnClickListener(){ 
    public void onClick(View v){ 
     int x = s2.getSelectedItemPosition(); 
     branchSel = arrSucsId[x]; 
     mainProc(); 
      saldoAdminTex.setText(strSaldo); //The late one 
    } 
};  

public void mainProc(){ 
    chekP = new Thread (null,doProc,"Background"); 
    chekP.start(); 
    mProgress =ProgressDialog.show(SivetaAsaldo.this, "","Obteniendo saldo...",true, false);  
} 

private Runnable doProc = new Runnable(){ 
    public void run(){ 
     if(getSaldoAdmin(levelSel,branchSel)) 
     { 
      mProgress.dismis(); 
        Log.i(TAG,"Task completed properly"); 
     }else  
      handler.post(tosti); 
    } 
}; 

所以我得到了“任务正确完成”,但似乎仍然等待别的东西,任何蛛丝马迹家伙? 感谢您抽出一点时间来检查它=)。

+0

太好了! AsyncTask是肯定的路要走=)谢谢你们! – 2011-03-10 18:39:08

回答

0

关于您的ProgressDialog,请参阅this answer关于如何使用AsyncTaskProgressDialog

1
saldoAdminTex.setText(strSaldo); //The late one 

将立即被调用。它不会等到mainProc中的Thread开始结束之后。您也不能关闭可运行的进程对话框。你只能在主UI线程上做UI相关的事情。

这将帮助您阅读Android Dev站点上Painless Threading的文章。

+0

确实如此,我会查看这篇文章并解决这个问题=)谢谢! – 2011-03-09 22:30:05

0

看你的代码,这样的:

saldoAdminTex.setText(strSaldo); 

之前,你的线程完成的线程将在平行于线运行将可能被执行。

另一种方法是这样:

public void mainProc(){ 
    mProgress =ProgressDialog.show(SivetaAsaldo.this, "","Obteniendo saldo...",true,false); 
    handler.post(new Runable(){ 
    public void run(){ 
     if(getSaldoAdmin(levelSel,branchSel)) 
     { 
      mProgress.dismis(); 
      saldoAdminTex.setText(strSaldo); 
      Log.i(TAG,"Task completed properly"); 
     }else  
      handler.post(tosti); 
    } 
}); 
} 
+0

罗比的权利,你不能在其他地方改变UI元素。在这个例子中, – 2011-03-09 22:30:52

+0

handler.post()将runnable发布回UI线程。 – longhairedsi 2011-03-09 23:57:20