android - 如何设置一个固定的时间如果AsyncTask没有完成

  显示原文与译文双语对照的内容
132 3

如果qt花费long时间,我下载数据库,但是我下载的是数据库,但我不想让用户 looping,但我想让用户 looping,这就是我在这里做

private class DownloadFilesTask extends AsyncTask<Void, Void, Void> {
 String s;
 public DownloadFilesTask(String s){
 this.s = s;
 }
 @Override
 protected Void doInBackground(Void... voids) {
 DownloadMethod(s);
 return null;
 }
 }

如果我想在一个固定时间,或者 20秒内执行,如果文件没有下载,我会向用户发送一条消息,告诉用户他需要检查他的网络。

时间:原作者:0个回答

64 4

在一定数量的时间之后,可以使用处理程序,并维护一个布尔标志,你可以在异步任务的postExecute函数中更新它。

在你的Activity/fragment 类中:

new Handler().postDelayed(new Runnable(){
 public void run(){
//Check whether the flag has been updated or not
 },1000)
原作者:
68 4

你可以使用 BroadcastReceiver 来监听你的互联网连接。以下是一个示例:

public class NetworkControl extends BroadcastReceiver {
static boolean isConnected = false;
@Override
public void onReceive(final Context context, final Intent intent) {
 isNetworkAvailable(context);
}
private boolean isNetworkAvailable(Context context) {
 ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 if (connectivity!= null) {
 NetworkInfo[] info = connectivity.getAllNetworkInfo();
 if (info!= null) {
 for (int i = 0; i <info.length; i++) {
 if (info[i].getState() == NetworkInfo.State.CONNECTED) {
 if(!isConnected){
 isConnected = true;
 Toast.makeText(context,"You're online!!", Toast.LENGTH_LONG).show();
 }
 return true;
 }
 }
 }
 }
 isConnected = false;
 Toast.makeText(context,"Connection interrupted.", Toast.LENGTH_LONG).show();
 return false;
}
}

你还需要在 AndroidManifest.xml 中使用一些权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

然后在 Activity 中启动服务。

 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
 receiver = new NetworkControl();
 registerReceiver(receiver, filter);
原作者:
101 2

如果你使用HttpURLConnection下载文件,那么你可以执行如下操作:

private class DownloadFilesTask extends AsyncTask<String, Integer, Integer> {
 @Override
 protected Integer doInBackground(String... ulr) {
 URL url = null;
 try {
 url = new URL(ulr[0]);
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 connection.setDoOutput(true);
 connection.setConnectTimeout(2000);//Timeout
//...Other codes for downloading
 return 101;
 } catch (java.net.SocketTimeoutException e) {
 return 102;
 } catch (MalformedURLException e) {
 return 103;
 } catch (IOException e) {
 return 104;
 }
 }
 @Override
 protected void onPostExecute(Integer result) {
 if(result == 102) {
 Toast.makeText(getApplicationContext(),"Connection Timeout.", Toast.LENGTH_LONG).show();
 }
 }
}
原作者:
51 1

首先我想说的是,在运行下载任务时,对于用户来说,这不是一个很好的做法,因为check your internet connection或者 no internet connection 。因为在这里情况下,如果用户在网络连接上然后再次重新启动,则重新启动。因此,避免这种类型的消息。

现在关于解决方案,执行后台任务后,可以检查任务正在运行或者已经完成。如果花了太多时间来显示消息。比如,

YourBackgroundTask task = new YourBackgroundTask();
task.execute();
new Handler().postDelayed(new Runnable() {
 @Override
 public void run() {
 if (task.getStatus == AsyncTask.Status.RUNNING){
 Toast.makeText(this,"Please wait...", Toast.LENGTH_SHORT).show();
 }
 }
},20000);//time in milisecond

如果你想重复这个,你可以轻松地运行处理器。

原作者:
124 2

下面是一个基本的想法,如果它能

private class DownloadFilesTask extends AsyncTask<Void, Integer, Void> implements TimerTask{
 String s;
 Timer timer;
 Object objectResult;
 public DownloadFilesTask(String s){
 this.s = s;
 timer = new Timer();
 }
 @Override
 protected Void doInBackground(Void... voids) {
 objectResult = DownloadMethod();
 return null;
 }
 private Object DownloadMethod() {
//here implement the download logic and return the object
 return null;
 }
 @Override
 protected void onProgressUpdate(Integer... progress) {
//your code to update progress
 }
 public void checkProgress(){
 timer.schedule(this,2000);
 }
 @Override
 public void run() {
 if (objectResult!=null){
//download completed 
 }else{
//show dialog here and schedule a task again
 timer.schedule(this,2000);
 }
 }
}
原作者:
...