为什么在doInbackground更新UI线程会遇到错误
1个回答
2015-12-28 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517181
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
1. 我所理解迄今为止,Android是......, 我们不能从更新后台线程UI线程。 可能是他们必须从更新后台线程的UI的情况下。 其中的原因是很清楚...@OS级别会有这么多的线程将运行。 并且还 从不同的应用不同的线程,而在这种情况下,这将是混乱的屏幕上,如果我们能够从BG-线程更新用户界面
2. 所以你必须只在OnPostExecute&OnPreExecute更新UI。 这里的AsyncTask的一个很好的例子。试试看 您可以通过调用它
new SaveProfile().execute();
那么这...
private class SaveProfile extends AsyncTask<String, Void, Boolean>{
@Override
protected Boolean doInBackground(String... params) {
//---------- so your stuff here.... non ui related
Log.v("response from saving",response);
if(response.equals("1")){
return true;
}else{
return false;
}
}
protected void onPostExecute(Boolean result) {
if(result) {
//------ UPDATE UI HERE
Toast.makeText(ProfileCompanyActivity.this, "profile saved", 2500).show();
}else{
Toast.makeText(ProfileCompanyActivity.this, "an error occured", 2500).show();
}
}
}
3. 里面的doInBackgroundyou不会得到用户界面的访问。如果你想利用UI访问publishProgress从doInBackgroundyou会去onProgressUpdate从那里做什么,你婉显示在UI上。 下面是代码 CodeGo.net,您将检查供您参考: 类DownloadAsyncTask扩展的AsyncTask {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(Login.this, "", "Please Wait ...");
}
@Override
protected Void doInBackground(String... arg0) {
int status1 = validationuser(username);
Log.i("MyLog", "Inside the doInBackground is came"+status1);
if(status1 == 1)
{
publishProgress(status1+ "Valid User Code","1",""+status1);
}
else
{
publishProgress(status1+ " Invalid Valid User Code","0",""+status1);
}
return null;
}
@Override
protected void onProgressUpdate(String...values){
super.onProgressUpdate(values);
int index = Integer.parseInt(values[2]);
if(index == 1)
{
USERIDLOGIN = edittextuserName.getText().toString();
Intent intent=new Intent(Login.this, CollectionModuleandDownload.class);
/*Toast.makeText(Login.this, "Valid User Password", Toast.LENGTH_SHORT).show();*/
startActivity(intent);
progressDialog.dismiss();
}
else
{
Toast.makeText(Login.this, "Invalid Username & Password", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}
@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);
/*if(progressDialog != null)
{
progressDialog.dismiss();
}*/
}
}
4. 当你创建一个Aysnc任务doInBackground方法运行在从UI线程的单独的线程。所以你不能从更新UI 该OnPostExecute和onPreExecute方法在线程作为UI线程中执行。进一步阅读到这里
5. 如果只允许一个线程去触摸界面,Android的可以保证,没有什么重要的改变,而它的views,并将其绘制到屏幕 这是..用户界面只能在当您尝试从另一个线程改变接口(做背景),在这种情况下被更新mainthread ..在你的屏幕上所有的接口对象由本mainthread维护....现在..它的错误例子..如果您尝试从非主线程其它改变seekbar(窗口小部件)价值。并试图把不同的值......那么它是Android ..因为它应该听哪个线程...希望澄清你的疑问.. 因此,它是像我们should'nt尝试..和它的安全性..我们不能尝试也。因为它给错误..=]
6. doInBackground执行繁重的计算或者你想在你的活动执行任何后台工作。 当在操作的完成上upadates你的UI .. 总之doinbackground是更新UI。
7. 我想答案是,我们绝不能 它只是看起来不合乎逻辑 它像试图改变电台在另一辆自动行驶在你身边.. 该架构是行不通的呀..您可以在电台上决定你之前设置给您的客场之旅,或当你停止驾驶,理论上你可以喊他,并要求他改变站,但你不能做自己。
8. 由于doInBackground()运行在独立的线程和onPostExecute运行在UIMain线程和每个Android提供constraints你不能更新从其他线程UIMain主题。 原因你是消息,而你正在运行的应用程序。
2. 所以你必须只在OnPostExecute&OnPreExecute更新UI。 这里的AsyncTask的一个很好的例子。试试看 您可以通过调用它
new SaveProfile().execute();
那么这...
private class SaveProfile extends AsyncTask<String, Void, Boolean>{
@Override
protected Boolean doInBackground(String... params) {
//---------- so your stuff here.... non ui related
Log.v("response from saving",response);
if(response.equals("1")){
return true;
}else{
return false;
}
}
protected void onPostExecute(Boolean result) {
if(result) {
//------ UPDATE UI HERE
Toast.makeText(ProfileCompanyActivity.this, "profile saved", 2500).show();
}else{
Toast.makeText(ProfileCompanyActivity.this, "an error occured", 2500).show();
}
}
}
3. 里面的doInBackgroundyou不会得到用户界面的访问。如果你想利用UI访问publishProgress从doInBackgroundyou会去onProgressUpdate从那里做什么,你婉显示在UI上。 下面是代码 CodeGo.net,您将检查供您参考: 类DownloadAsyncTask扩展的AsyncTask {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(Login.this, "", "Please Wait ...");
}
@Override
protected Void doInBackground(String... arg0) {
int status1 = validationuser(username);
Log.i("MyLog", "Inside the doInBackground is came"+status1);
if(status1 == 1)
{
publishProgress(status1+ "Valid User Code","1",""+status1);
}
else
{
publishProgress(status1+ " Invalid Valid User Code","0",""+status1);
}
return null;
}
@Override
protected void onProgressUpdate(String...values){
super.onProgressUpdate(values);
int index = Integer.parseInt(values[2]);
if(index == 1)
{
USERIDLOGIN = edittextuserName.getText().toString();
Intent intent=new Intent(Login.this, CollectionModuleandDownload.class);
/*Toast.makeText(Login.this, "Valid User Password", Toast.LENGTH_SHORT).show();*/
startActivity(intent);
progressDialog.dismiss();
}
else
{
Toast.makeText(Login.this, "Invalid Username & Password", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}
@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);
/*if(progressDialog != null)
{
progressDialog.dismiss();
}*/
}
}
4. 当你创建一个Aysnc任务doInBackground方法运行在从UI线程的单独的线程。所以你不能从更新UI 该OnPostExecute和onPreExecute方法在线程作为UI线程中执行。进一步阅读到这里
5. 如果只允许一个线程去触摸界面,Android的可以保证,没有什么重要的改变,而它的views,并将其绘制到屏幕 这是..用户界面只能在当您尝试从另一个线程改变接口(做背景),在这种情况下被更新mainthread ..在你的屏幕上所有的接口对象由本mainthread维护....现在..它的错误例子..如果您尝试从非主线程其它改变seekbar(窗口小部件)价值。并试图把不同的值......那么它是Android ..因为它应该听哪个线程...希望澄清你的疑问.. 因此,它是像我们should'nt尝试..和它的安全性..我们不能尝试也。因为它给错误..=]
6. doInBackground执行繁重的计算或者你想在你的活动执行任何后台工作。 当在操作的完成上upadates你的UI .. 总之doinbackground是更新UI。
7. 我想答案是,我们绝不能 它只是看起来不合乎逻辑 它像试图改变电台在另一辆自动行驶在你身边.. 该架构是行不通的呀..您可以在电台上决定你之前设置给您的客场之旅,或当你停止驾驶,理论上你可以喊他,并要求他改变站,但你不能做自己。
8. 由于doInBackground()运行在独立的线程和onPostExecute运行在UIMain线程和每个Android提供constraints你不能更新从其他线程UIMain主题。 原因你是消息,而你正在运行的应用程序。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询