バックグラウンドでネットワーク機能 (ファイルのダウンロード/アップロード、http 要求) を実行するアプリケーションに asynctasks がいくつかあります。これらのアクションProgressDialog
の進行中に、タスクの進行状況に関するメッセージを表示するために使用します。ただし、一部のタスクは完了までに時間がかかる場合があり (低速ネットワークでファイルをダウンロードするなど)、これはアプリケーションにとって望ましくないことです。
各 asynctask の期間を制御するパラメーターを設定するにはどうすればよいですか? タスク内のジョブの完了に関係なく、ある時点で asynctask を完了させたいです。asynctask で onPostExecute メソッドを呼び出さなければなりません。
私はこれについて読みましたhttp://developer.android.com/reference/android/os/AsyncTask.html#get%28long,%20java.util.concurrent.TimeUnit%29
UI がフリーズし、asynctask の期間を実際に制御できなかったため、これはあまり役に立ちませんでした。
これは私のコードの一部です
public void downloadFiles(String address) {
String mainUrl =address;
//// I overrride the onPostExecute to get
/// results and call another asynctask
new Downloader(this){ //<--asynctask
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
TestResults=result;
//another method called that creates another asynctask
uploadFiles(mainUrl);
}
}.execute(mainUrl);
}
このような Handler も使用しようとしましたが、 どちらも機能しませんでした。
一定期間後に asynctask が結果を返すようにする方法はありますか (つまり、asynctask が onPostExecute メソッドを呼び出すことを意味します)。
asnctask の doInBackground メソッドで while ループを使用することは解決策ではありません。asynctask が結果を返すようにするには、mainUI からのタイマーが必要だと思います。
PS私はフラグメントを使用してアプリケーションを持っていますnew Downloader(this)
。そのため、フラグメントからGUIを渡すために呼び出します。
これを試してみました:
public void downloadFiles(String address) {
String mainUrl =address;
final Downloader tempObject =new Downloader(this){
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
downloadResults=result;
}
};
try {
tempObject.execute(mainUrl).get(3000L, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これにより、UI が 3 秒間フリーズし、タスクが呼び出されます....これは私が望んでいるものではありません。
これも試しました:
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( tempObject.getStatus() == Downloader.Status.RUNNING )
tempObject.cancel(true);
}
}, 5000 );
これにより、asynctask の onProgressUpdate のメッセージが停止しますが、asynctask は実行を続けます....
何か案は ?