当前位置: 动力学知识库 > 问答 > 编程问答 >

android - App freezes with TimerTask with AsyncTask

问题描述:

I have scheduled a AsyncTask using a Timer by following code

public void toCallAsynchronous() {

TimerTask doAsynchronousTask;

final Handler handler = new Handler();

Timer timer = new Timer();

doAsynchronousTask = new TimerTask() {

@Override

public void run() {

// TODO Auto-generated method stub

handler.post(new Runnable() {

public void run() {

try {

if(mLoggedIn)

{

DownloadRandomPicture download = new DownloadRandomPicture(this, mApi, CLIENT_ID, mImage);

download.execute();

}

} catch (Exception e) {

// TODO Auto-generated catch block

}

}

});

}

};

timer.schedule(doAsynchronousTask, 0,50000);//execute in every 50000 ms

}

@Override

protected Boolean doInBackground(Void... params) {

try {

if (mCanceled) {

return false;

}

// Get the metadata for a directory

Entry dirent = mApi.metadata(mPath, 1000, null, true, null);

if (!dirent.isDir || dirent.contents == null) {

// It's not a directory, or there's nothing in it

mErrorMsg = "File or empty directory";

return false;

}

// Make a list of everything in it that we can get a thumbnail for

ArrayList<Entry> thumbs = new ArrayList<Entry>();

for (Entry ent: dirent.contents) {

if (ent.thumbExists) {

// Add it to the list of thumbs we can choose from

thumbs.add(ent);

}

}

if (mCanceled) {

return false;

}

if (thumbs.size() == 0) {

// No thumbs in that directory

mErrorMsg = "No pictures in that directory";

return false;

}

// Now pick a random one

int index = (int)(Math.random() * thumbs.size());

Entry ent = thumbs.get(index);

String path = ent.path;

mFileLen = ent.bytes;

String cachePath = mContext.getCacheDir().getAbsolutePath() + "/" + IMAGE_FILE_NAME;

try {

mFos = new FileOutputStream(cachePath);

} catch (FileNotFoundException e) {

mErrorMsg = "Couldn't create a local file to store the image";

return false;

}

// This downloads a smaller, thumbnail version of the file. The

// API to download the actual file is roughly the same.

mApi.getThumbnail(path, mFos, ThumbSize.BESTFIT_960x640,

ThumbFormat.JPEG, null);

if (mCanceled) {

return false;

}

mDrawable = Drawable.createFromPath(cachePath);

// We must have a legitimate picture

return true;

} catch (DropboxUnlinkedException e) {

// The AuthSession wasn't properly authenticated or user unlinked.

} catch (DropboxPartialFileException e) {

// We canceled the operation

mErrorMsg = "Download canceled";

} catch (DropboxServerException e) {

// Server-side exception. These are examples of what could happen,

// but we don't do anything special with them here.

if (e.error == DropboxServerException._304_NOT_MODIFIED) {

// won't happen since we don't pass in revision with metadata

} else if (e.error == DropboxServerException._401_UNAUTHORIZED) {

// Unauthorized, so we should unlink them. You may want to

// automatically log the user out in this case.

} else if (e.error == DropboxServerException._403_FORBIDDEN) {

// Not allowed to access this

} else if (e.error == DropboxServerException._404_NOT_FOUND) {

// path not found (or if it was the thumbnail, can't be

// thumbnailed)

} else if (e.error == DropboxServerException._406_NOT_ACCEPTABLE) {

// too many entries to return

} else if (e.error == DropboxServerException._415_UNSUPPORTED_MEDIA) {

// can't be thumbnailed

} else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {

// user is over quota

} else {

// Something else

}

// This gets the Dropbox error, translated into the user's language

mErrorMsg = e.body.userError;

if (mErrorMsg == null) {

mErrorMsg = e.body.error;

}

} catch (DropboxIOException e) {

// Happens all the time, probably want to retry automatically.

mErrorMsg = "Network error. Try again.";

} catch (DropboxParseException e) {

// Probably due to Dropbox server restarting, should retry

mErrorMsg = "Dropbox error. Try again.";

} catch (DropboxException e) {

// Unknown error

mErrorMsg = "Unknown error. Try again.";

}

return false;

}

I am calling this from onCreate of my activity. My async task basically downloads some data from server. My main activity allows user to login to server and then I go for fetching the data. What I am doing wrong here ? Any idea about it

分享给朋友:
您可能感兴趣的文章:
随机阅读: