gpt4 book ai didi

android - 了解 UI 线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:45 24 4
gpt4 key购买 nike

我是 Android 的初学者,我对 Android UI Thread 有一些困惑。现在,我知道除了创建 UI 的线程之外,没有任何线程可以修改它。

太好了。
这是我的第一个 Android 应用程序中的 Activity,这让我有些困惑。

public class NasaDailyImage extends Activity{
public ProgressDialog modalDialog = null;
//------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState){

//Instantiate progress dialog, skipping details.

Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog.show(); // show modal
Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
}
});
}
//------------------------------------------------------------------------------
public synchronized void resetDisplay(boolean parseErrorOccured,
boolean imageErrorOccured,
IotdHandler newFeeds){
if(parseErrorOccured || imageErrorOccured){
// make a Toast
// do not update display
}else{
// make a Toast
// update display
// based on new feed
}
}
//------------------------------------------------------------------------------
class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{

@Override
protected IotdHandler doInBackground(IotdHandler... arg0) {
IotdHandler handler = arg0[0];
handler.processFeed(); // get the RSS feed data !
return handler;
}
//------------------------------------------------------------------------------
@Override
protected void onPostExecute(IotdHandler fromInBackground){
resetDisplay( // call to update the display
fromInBackground.errorOccured,
fromInBackground.imageError,
fromInBackground);
}
//------------------------------------------------------------------------------


}


1. onCreate 在 UI 线程上,所以我可以做任何我想做的事,但 onClick 不是。 为什么我可以在那个方法中制作一个ProgressDialog和一个Toast为什么那里没有错误?
2. AsyncTaskNasaDailyImage 的子类。这意味着它可以访问 所有 NasaDailyImage 的方法,包括更新显示的 resetDisplay()resetDisplay()onPostExecute 中调用,它在与 UI 不同的线程上运行。那么,为什么我可以在那里更新显示却没有出现错误?

最佳答案

  1. onClick() 确实在 UI 线程上。 Activity 中发生的大部分事情都发生在 UI 线程上。

  2. onPostExecte()(及其对应的 onPreExecute())也在 UI 线程上运行。 AsyncTask.onPostExecte() documentation清楚地说明了这一点。 AsyncTask 经过精心设计,使开发人员可以在进行后台工作之前和之后更新 UI。

通常,您的代码将在 UI 线程上运行,除非您明确指定它。创建 AsyncTasks、Runnables 或 Threads 后,您需要确保了解代码的执行位置。在 Activity 中,通常可以安全地假设您在 UI 线程上。

关于android - 了解 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com