【问题标题】:How to set a fixed time if AsyncTask is not finished如果 AsyncTask 未完成如何设置固定时间
【发布时间】:2018-06-15 13:32:59
【问题描述】:

我有一个异步任务,如果异步耗时太长,我希望等待,我正在下载数据库的一些数据,但我不想让用户在进度对话框中循环,我想设置一个固定的时间,假设我正在下载一个文件,但要花很长时间,所以我告诉用户,“嘿,检查你的互联网连接,然后再试一次”我想用计时器来做这个,但我我有点卡住了,这是我做异步任务的地方

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;
             }
         }

假设我想在固定时间执行该下载方法,10 或 20 秒,如果当时没有下载文件,我会向用户返回一条消息,说他需要检查他的互联网。

【问题讨论】:

  • 也在找这个!
  • 下载前检查网络连接。
  • 你可以使用这样的东西:stackoverflow.com/a/31601166/6383029
  • 但我不想在执行前等待,我想在执行后等待
  • 你还有一个问题。如果 AsyncTask 永远卡住了,你将永远无法运行另一个,因为下一个默认在同一个线程中运行。

标签: android android-asynctask


【解决方案1】:

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

在您的活动/片段类中:

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

【讨论】:

    【解决方案2】:

    您可以使用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" />
    

    然后在您的活动中启动该服务。

        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        receiver = new NetworkControl();
        registerReceiver(receiver, filter);
    

    【讨论】:

      【解决方案3】:

      如果您使用 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();
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        首先我想说的是,在运行下载任务时,向用户发送check your internet connectionno 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
        

        如果你想重复这个,你可以很容易地重新运行处理程序。

        【讨论】:

          【解决方案5】:

          这是一个基本想法,如果可行,您可以尝试

          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);
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-13
            • 2016-07-14
            • 1970-01-01
            • 1970-01-01
            • 2015-11-16
            • 2021-12-30
            相关资源
            最近更新 更多