2012-10-30 44 views
1

使用Timer通过下面的代码的AsyncTask与定时器继续运行

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; 
} 
protected void onProgressUpdate(Long... progress) { 
     int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5); 
     //mDialog.setProgress(percent); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     //mDialog.dismiss(); 
     if (result) { 
      // Set the image now that we have it 
      mView.setImageDrawable(mDrawable); 
     } else { 
      // Couldn't download it, so show an error 
      showToast(mErrorMsg); 
     } 
    } 

我从我的活动onCreate调用这个我已经计划了的AsyncTask。我的异步任务基本上从服务器下载一些数据。主要活动允许用户登录到服务器,然后我去提取数据。我面临的问题是每个AsyncTask都创建自己的线程。而且,这些都不会完成。线程状态始终在运行。有没有办法检查新的AsyncTask是否只在早期完成时启动。

+0

你不应该能够从UI一个单独的线程运行的AsyncTask让我很惊讶,这不是崩溃。 – DeeV

+0

如果您打算实施周期性功能,则应考虑使用服务而不是活动。 –

+1

http://stackoverflow.com/questions/7494515/android-can-i-chain-async-task-sequentially-starting-one-after-the-previous-as和http://stackoverflow.com/questions/10048958/android-calling-asynctask-right-after-an-finished- – user1690588

回答

0

尝试这种方式

public ArrayBlockingQueue<Runnable> threadList = new ArrayBlockingQueue<Runnable>(
     2000, true); 
public ThreadPoolExecutor threadPool = new ThreadPoolExecutor(0, 
     2000, 1000, TimeUnit.MILLISECONDS, threadList); 

TimerTask t=new TimerTask() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        //your code here 
       } 
      };  

ThreadPool.execute(t); 
0

线timer.schedule(doAsynchronousTask, 0,50000);//execute in every 50000 ms负责重复性工作。

作为每Timer类的日程安排的描述(TimerTaskObject,INT开始,INT repete)方法,这将重复一个特定的TimerTask定义时间间隔,建议你到如下改变它,

timer.schedule(doAsynchronousTask, 1000);//execute once after one second 
+0

但是这个任务只运行一次 – Ankuj

+0

所以你想运行多次?为什么? – Lucifer

+0

这是因为我正在检查服务器上的数据是否已更改。如果是,请下载该数据。 – Ankuj