我有一个有两个活动的应用程序.从主要活动我开始使用的辅助活动startActivityForResult().辅助活动将数据(以Intent对象的形式)返回到主活动.在主要活动上,我有一个方法onActivityResult()来处理从次要活动回来.
在这个onActivityResult()方法中,我需要更新View主要活动(以反映新的数据值).我没有显式生成任何线程.我的问题是:我可以直接从onActivityResult()方法内部修改视图,还是需要在UI队列上放置一个事件来执行此操作?更明确一点:我可以确定该onActivityResult()方法是在UI线程上,在这种情况下,我可以忘记UI队列吗?
我已经浏览了许多在Android中使用SQLite的示例/教程.比方说,你有使用SQLite,一个应用程序ContentProvider,CursorLoader一个自定义CursorAdapter.现在我发现的所有主要示例都依赖于a CursorLoader来获取数据CursorAdapter,这本质上CursorLoader是以Async-UI线程安全的方式发生的.然而,这些相同的例子都使插入/删除/更新通过调用ContentResolver在主线程(例如,从onClick,onResume,onPause).(示例)它们不会将这些调用包装在一个AsyncTask或启动一个单独的线程中或使用AsyncQueryHandler.为什么这样,如此多的写得好的博客/例子怎么会犯这么明显的错误呢?或者是简单的单行插入/删除/更新调用如此之快,以至于它们足以安全地从Main/UI线程启动?这些快速通话的正确方法是什么?
似乎api replaceCurrentItemWithPlayerItem:将主线程卡住几秒钟,我明白更换项目需要新项目的信息,这可能需要一些时间来预加载.但是问题出现了,为什么replaceCurrentItemWithPlayerItem:用一个nil项目对象也会卡住主线程?在我看来,有时需要超过5秒的时间才能替换nil playerItem.我想知道如何避免这个问题.谢谢你的任何建议!
我看到几个与我几乎完全相同的问题,但我找不到满足我所有疑虑的完整答案..所以我在这里..假设你有一个内部类的活动,扩展了这个AsyncTask类:
public class MyActivity extends Activity {
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return DownloadImage(urls[0]);
}
protected void onPostExecute(Bitmap result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new DownloadImageTask().execute("http://mysite.com/image.png")
}
}
Run Code Online (Sandbox Code Playgroud)
假设活动暂停或销毁(可能两种情况不同),而 DownloadImageTask仍然在后台运行..那么,DownloadImageTask可以触发在活动UI线程上运行的方法,并且DownloadImageTask可能尝试访问Activity的方法(它是一个内部类,因此它可以使用暂停或销毁的Activity来访问外部类的方法和实例变量,就像findViewByID下面示例中的调用一样..那么会发生什么?它是否默默失败?它会产生任何异常吗?是否会通知用户出现了问题?
如果在调用run-on-UI方法时我们应该注意启动线程(本例中的Activity)仍处于活动状态,那么我们如何从内部实现AsyncTask呢?
如果您认为这是一个重复的问题,我很抱歉,但也许这个问题有点明确,有人可以更详细地回答
我有一个ProgressBarWindow,它有一个进度条和一个取消按钮,我用它来报告文件I/O的进度.但是,尽管在后台工作中完成了所有工作,但ProgressBarWindow的UI线程和我的主窗口都会挂起.进度条呈现,就像我的主窗口一样,但是在后台工作人员执行其操作时不会更新.在主窗口的构造函数的最后调用以下代码:
iCountLogLinesProgressBar = new ProgressBarWindow();
iCountLogLinesProgressBar.cancelButton.Click += EventCountLogLinesProgressBarCancelButtonClicked;
iCountLogLinesProgressBar.Show();
iCountLogRecords = new BackgroundWorker();
iCountLogRecords.DoWork += EventCountLogLinesDoWork;
iCountLogRecords.ProgressChanged += EventCountLogLinesProgressChanged;
iCountLogRecords.RunWorkerCompleted += EventCountLogLinesRunWorkerCompleted;
iCountLogRecords.WorkerReportsProgress = true;
iCountLogRecords.WorkerSupportsCancellation = true;
iCountLogRecords.RunWorkerAsync(new BinaryReader(File.Open(iMainLogFilename, FileMode.Open, FileAccess.Read)));
Run Code Online (Sandbox Code Playgroud)
EventCountLogLinesProgressChanged()看起来像这样:
private void EventCountLogLinesProgressChanged(object sender, ProgressChangedEventArgs e)
{
iCountLogLinesProgressBar.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
这是ProgressBarWindow的缩短版本(其余只是几个setter):
public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
this.progressBar.Value = this.progressBar.Minimum = 0;
this.progressBar.Maximum = 100;
}
public double Value
{
get
{
return progressBar.Value;
}
set
{
this.progressBar.Value = value;
} …Run Code Online (Sandbox Code Playgroud) JavaScript是单线程的 - Silverlight不是,但必须在Silverlight UI线程上执行JavaScript和Silverlight之间的交互.
但是,Silverlight UI线程和JavaScript线程之间的关系究竟是什么?它们是通过任何定义相同的线程,还是单独的线程与纯粹通过相应的事件循环执行的交互,并在等待另一个时阻塞一个线程(例如,在评估/调用Silverlight中的JavaScript时)?换句话说,JavaScript可以与UI线程上的Silverlight操作同时执行(并且同一页面中托管的多个Silverlight实例可以同时运行其UI线程)吗?
我是Android开发的新手.我已经在Swing和SWT工作了好几年.Swing和SWT都有一个在UI线程同步和异步中执行代码的策略.典型的用法是在一个线程中做一些耗时人员,然后在UI线程异步中显示结果.
所以我的问题是,Android中有类似的策略吗?这是我的代码.参数runnable是一些耗时代码.此方法将在执行期间显示等待对话框,然后EXPECT在完成后显示Toast.但Toast需要在UI线程中显示.那怎么办呢?
public static void showWaitingDialog(final Activity parent, final Runnable runnable, String msg) {
if (StringUtils.isEmpty(msg)) {
msg = "processing...";
}
final ProgressDialog waitingDialog = ProgressDialog.show(parent, "Please Wait...", msg, true);
// execute in a new thread instead of UI thread
ThreadPoolUtil.execute(new Runnable() {
public void run() {
try {
// some time-consume operation
runnable.run();
} catch (Exception e) {
e.printStackTrace();
} finally {
waitingDialog.dismiss();
}
// TODO: How to display a Toast message here? execute some code in UI Thread. …Run Code Online (Sandbox Code Playgroud) 我遇到了一个有趣的问题.如果您在onCreate/onStart/onResume活动方法中编写以下代码:
final Button myButton = (Button)findViewById(R.id.myButton);
final TextView myTextView = (TextView)findViewById(R.id.myTextView);
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
myTextView.setText("Hello text");
}
});
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
thread.start();
}
});
Run Code Online (Sandbox Code Playgroud)
要么:
final TextView myTextView = (TextView)findViewById(R.id.myTextView);
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(500);
}
catch (InterruptedException e) {
e.printStackTrace();
}
myTextView.setText("Hello text");
}
});
thread.start();
Run Code Online (Sandbox Code Playgroud)
应该如何,抛出一个错误
android.view.ViewRoot $ CalledFromWrongThreadException: …Run Code Online (Sandbox Code Playgroud) 我一直AsyncTask在为android的短时间背景操作编写很长一段时间,并且有一个非常基本的问题.如果我一开始AsyncTask从一个单独的线程,而不是在主UI线程,将我onPreExecute()和onPostExecute方法被称为静止在UI线程或从我开始的线程AsyncTask.我很好奇,因为onPreExecute()当我从其他线程启动它时,我无法在方法中显示弹出窗口.
编辑2
I tried writing this simple activity to try:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
final TestAsyncTask task = new TestAsyncTask();
task.execute();
}
}).start();
}
private class TestAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
return null;
}
@Override …Run Code Online (Sandbox Code Playgroud) 我需要编写一个围绕第三方api的包装器,它会使用消息泵,因此根据是否在UI线程(例如在wpf应用程序中)实例化包装器(例如控制台应用程序),需要对其进行非常不同的处理).
如果它不在UI线程上运行,那么我需要一个调度程序并实现我自己的消息泵.
为此,我需要知道包装器是否在wpf应用程序中实例化.仅确定实例化是否发生在UI线程上是不够的(即使在wpf应用程序中,实例化包装器的线程可能不是UI线程).
有什么办法我可以弄清楚我是在一个带有消息泵或控制台应用程序的wpf或windows窗体环境中我必须实现自己的消息泵吗?
谢谢
ui-thread ×10
android ×6
c# ×2
wpf ×2
.net ×1
avplayer ×1
dispatcher ×1
ios ×1
java ×1
javascript ×1
progress-bar ×1
silverlight ×1
sql-insert ×1
sqlite ×1
view ×1