Vid*_*nes 34 android android-asynctask
我遇到了AsyncTask类的问题.在创建4个或5个任务后,我的任务似乎停止了.
我有2个活动.MainActivity只包含一个按钮,用于启动名为ImageActivity的第二个活动.
ImageActivity非常简单.它有一个onCreate设置布局,然后它启动一个新的AsyncTask,从Internet加载图像.这在前几次工作正常.但它突然停止工作.每次运行onPreExecute方法,但不运行doInBackground方法.我试图用睡眠循环简化doInBackground,同样的事情发生了.我无法理解这种行为,因为asynctask在onDestroy方法中都被取消并设置为null.所以每次我开始一个新的ImageActivity,我也会创建一个新的AsyncTask.
我通过点击后退按钮重新创建ImageActivity和任务,而不是单击MainActivity上的按钮.
任何人的想法?我真的很挣这个.
更新:启动ImageActivity的代码(在onClickListener按钮内)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setClassName(this, ImageActivity.class.getName());
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
上面的代码开始此活动
public class ImageActivity extends Activity {
private AsyncTask<Void, Void, Void> task;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
task = new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute()
{
Log.d(TAG, "onPreExecute()");
}
@Override
protected Void doInBackground(Void... params)
{
Log.d(TAG, "doInBackground() -- Here is the download");
// downloadBitmap("http://mydomain.com/image.jpg")
return null;
}
@Override
protected void onPostExecute(Void res)
{
Log.d(TAG, "onPostExecute()");
if(isCancelled()){
return;
}
}
}.execute();
}
@Override
protected void onDestroy()
{
super.onDestroy();
task.cancel(true);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
我已经使用传统Threads和runOnUiThread方法的组合进行了测试,似乎效果更好.现在线程每次运行.
Vid*_*nes 24
删除AsyncTask并使用传统的Thread而不是将它与runOnUiThread结合起来似乎可行.但我还没有找到AsyncTask如此"不稳定"的原因.
这是适合我的代码:
public class ImageActivity extends Activity {
private Thread worker;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
worker = new Thread(new Runnable(){
private void updateUI(final List<Object> list)
{
if(worker.isInterrupted()){
return;
}
runOnUiThread(new Runnable(){
@Override
public void run()
{
// Update view and remove loading spinner etc...
}
});
}
private List<Object> download()
{
// Simulate download
SystemClock.sleep(1000);
return new ArrayList<Object>();
}
@Override
public void run()
{
Log.d(TAG, "Thread run()");
updateUI(download());
}
});
worker.start(); }
@Override
protected void onDestroy()
{
super.onDestroy();
worker.interrupt();
}
}
Run Code Online (Sandbox Code Playgroud)
我也遇到了这个问题.如果您使用AsyncTask.execute,您的任务将在串行队列上运行(来自Android 4.3源代码):
首次引入时,AsyncTasks在单个后台线程上串行执行.从DONUT开始,这被改为一个线程池,允许多个任务并行运行.从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误.
这与我所看到的行为一致.我AsyncTask弹出一个对话框doInBackground并阻止,直到对话框关闭.该对话框需要自己AsyncTask完成.对话框的AsyncTask.doInBackground方法从未执行,因为原始文件AsyncTask仍然被阻止.
解决方案是AsyncTask单独执行第二个Executor.
| 归档时间: |
|
| 查看次数: |
43171 次 |
| 最近记录: |