我正在尝试同时运行两个AsyncTasks.(平台是Android 1.5,HTC Hero.)但是,只有第一个被执行.这是一个描述我的问题的简单片段:
public class AndroidJunk extends Activity {
class PrinterTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String ... x) {
while (true) {
System.out.println(x[0]);
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new PrinterTask().execute("bar bar bar");
new PrinterTask().execute("foo foo foo");
System.out.println("onCreate() is done.");
}
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
onCreate() is done.
bar bar bar
foo foo foo
bar bar bar
foo foo foo
Run Code Online (Sandbox Code Playgroud)
等等.但是,我得到的是:
onCreate() is done. …Run Code Online (Sandbox Code Playgroud) 我遇到了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(); …Run Code Online (Sandbox Code Playgroud) 我写了一个AsyncTask,大部分时间它的构造函数被调用并且其doInBackground被调用(0毫秒延迟)之间没有延迟.但是每当在后台进行联系人同步时,我的AsyncTasks的构造函数和doInBackground之间经常会有1-3秒的延迟.在我的情况下,这种延迟是不可接受的.我知道AsyncTask是一个后台线程,这个问题可以通过使用Thread并将其优先级设置得更高来解决.但我想知道的是,我怎么知道是什么导致我的AsyncTask的doInBackground被调用?我使用了adb shell top -m 10,当这个问题发生时,进程使用似乎很正常.
任何帮助表示赞赏.
谢谢
我正在使用的应用程序是使用后台线程通过API下载图像列表,然后以幻灯片形式显示图像.
有一个后台任务(当前是AsyncTask)来定期获取新图像.
我没有得到关于错误的线程等的任何错误消息,只是AsyncTasks的第二个实例不会运行doInBackground方法.
以下是Activity的一些代码:
private DownloadTask mDownloadTask = null;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(mDownloadTask != null) {
mDownloadTask.cancel(true);
}
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
};
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
Run Code Online (Sandbox Code Playgroud)
该DownloadTask如下所示:
@Override
protected List<String> doInBackground(Void... voids) {
// Download list of URLs from server, etc.
}
@Override
protected void onPostExecute(List<String> urls) {
mHandler.sendEmptyMessageDelayed(111, 5000);
}
Run Code Online (Sandbox Code Playgroud)
将调用该处理程序,将调用onPreExecute(在AsyncTask中)并且DownloadTask的初始运行(右上onCreate …
我一直在尝试从网址下载视频,我已经在asynctask的doInBackground()中实现了我的下载方法,但是doInBackground方法花了很多时间来调用(5-10分钟),我正在使用另一个asyntask在我从事的活动中下载图像,以下载视频活动及其工作正常.我的onPreExecute方法正在按时调用,但之后doInBackground需要大约5-7分钟才能启动.我将非常感谢您提供的任何帮助.这是我的代码
btnDownloadLQ.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0)
{
try
{
new DownloadVideoTask().execute(videoURL);
}
catch(Exception e)
{
Log.e("Vidit_TAG","I got an error",e);
}
}
});
private class DownloadVideoTask extends AsyncTask<String, String, String>
{
@SuppressWarnings("deprecation")
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
protected String doInBackground(String... urls)
{
int i=0;
try
{
URL url = new URL (urls[0]);
InputStream input = url.openStream();
try {
//The sdcard directory e.g. '/sdcard' can be used directly, or
//more safely abstracted with getExternalStorageDirectory()
String root …Run Code Online (Sandbox Code Playgroud) 我在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所花费的时间.
这是我的代码的一部分:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Temp:",System.currentTimeMillis()+"");
new Move().execute();
/*some other logic
}
}
Run Code Online (Sandbox Code Playgroud)
我的AsyncTask是:
private class Move extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... temp) {
Log.d("start:",System.currentTimeMillis()+"");
gson.fromJson(Web.Request.get(some_URL),Void.class);
Log.d("end:",System.currentTimeMillis()+"");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我得到的日志:
32658-998/com.example.game D/temp:? 1408923006159
32658-998/com.example.game D/start:? 1408923035163
32658-998/com.example.game D/end:? 1408923035199
Run Code Online (Sandbox Code Playgroud)
实际上,在doInBackground方法中到达第一行几乎需要29秒,因为完成网络调用只花了36毫秒.我尝试了很多次,所用的时间几乎是一样的.
是否可以立即启动AsyncTask?或者有没有其他方法来解决这个问题.(除了运行一个简单的线程?)谢谢:)
我有一个包含以下方法的嵌套片段:
public void onSave() {
if (getActivity() == null || view == null) return;
if (file != null && file.exists()) {
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
Log.d("log", "onPreExecute of save ex");
}
@Override
protected Void doInBackground(Void... params) {
Log.d("log", "doInBackground of save ex");
//DO SOMETHING
return null;
}
protected void onPostExecute(Void result) {
BaseFragment fragment = new LocalListFragment();
((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment);
Log.d("log", "end of save ex");
};
}.execute();
} else {
showAlert();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我第一次调用此方法,它将执行直到onPostExecute().但是,如果我转到其他片段并重新打开此片段(通过创建一个新的片段对象并替换它),则只执行onPreExecute().为什么这个asyncTask对象第二次没有很好地执行?
如果我使用executeOnExecutor()那么它会在第二次正常工作.但为什么不执行()工作?AsyncTask的生活是否与片段或其他东西联系在一起?
提前致谢!
我想安排或排队在后台执行Multiple AsyncTask.我有一个在Service中运行的HTTP post请求的AsyncTask,同时我在AsyncTask的UI线程中再发一个HTTP请求.
UI线程执行时间太长,因为已经有一个线程在服务中运行.如何解决这个问题.
我需要暂停服务线程,我想首先执行UI线程,然后再次为AsyncTask重新启动服务线程.
提前致谢
java multithreading android priority-queue android-asynctask