2016-07-16 9 views
2

私はこの機能を実装したいと思います: ユーザーがボタンをクリックしてタスクを開始し、5分後に1つのファイルをdropboxに送信すると、ユーザーがボタンで別の時間をクリックすると、タスクのアボートと新しいタスク(5分)の開始。長い遅延AsyncTaskと再開タスク

私はDropboxにファイルをアップロードするコードを書いていましたが、このような長い時間(5分)のタスクを使ってコードを書かなかったのです。 どうすればいいですか?

- EDIT - xdevs23 @

おかげで、私は最終的なコード

public void onSendOrder() { 

     try { 
      mHandler.removeCallbacks(postRunnable); // stop current wait 
     } catch(Exception ex) { 
      // Just if the above fails (might be first time) 
      ex.printStackTrace(); 
     } 
     int minutes = 5; 
     mHandler.postDelayed(postRunnable, minutes * 20 * 1000 /* 5 minutes in milliseconds */); 
... 
... 
... 

private Runnable postRunnable = new Runnable() { 
     @Override 
     public void run() { 
      Thread myThread = new Thread(myRunnable); 
      myThread.start(); 
     } 
    }; 


    private Runnable myRunnable = new Runnable() { 
      @Override 
      public void run() { 
       // your code 
       int cloud = GetPreferenceCloud(); 
       if(cloud > 0){ 
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
        final File bckDatabase = BackupDatabase(); 

        if (networkInfo != null && networkInfo.isConnected() && bckDatabase != null) { 

        runOnUiThread(new Runnable() { 
         public void run() { 
          // call your asynctask here 
          new UploadOnCloud(MainActivity.this, 
            PreferenceConstants.DB_DATABASE_STORE_CLOUD, 
            PreferenceConstants.FILE_DIR_CLOUD, 
            bckDatabase, 
            mUListener, 
            cloud).execute(); 
         } 
        }); 

       } else { 
         Toast.makeText(getContext(),getContext().getResources().getString(R.string.send_msg13), Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     }; 

* EDITを実装しています。 V2 *

のために、私はこれを実装しましたステータスバー上でカウントダウンを実装:

onSend機能を変更します。

public void onSendOrder() { 

     try { 
      mHandler.removeCallbacks(postRunnable); // stop current wait 
     } catch(Exception ex) { 
      // Just if the above fails (might be first time) 
      ex.printStackTrace(); 
     } 
     minute = 3600; 
     //mHandler.postDelayed(postRunnable, minutes * 20 * 1000 /* 5 minutes in milliseconds */); 
     mHandler.postDelayed(postRunnable, 1000 /* 1 seconds */); 

.... ....

ファイルmenu.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item android:id="@+id/break_timer" 
      android:title="00:00" 
      app:showAsAction="always" 
      app:actionViewClass="android.widget.TextView" /> 
    <item 
     android:id="@+id/action_refresh" 
     android:title="@string/action_refresh" 
     app:showAsAction="ifRoom" 
     android:icon="@drawable/ic_action_autorenew"/> 
</menu> 

onCを変更するreateOptionsMenu

public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.main, menu); 
     MenuItem timerItem = menu.findItem(R.id.break_timer); 
     timerText = (TextView) MenuItemCompat.getActionView(timerItem); 
     timerText.setPadding(10, 0, 10, 0); //Or something like that... 

     return super.onCreateOptionsMenu(menu); 
    } 


private int minute; 
    private Runnable postRunnable = new Runnable() { 
     @Override 
     public void run() { 
      if(minute >= 0){ 
       minute--; 
       mHandler.postDelayed(postRunnable, 1000 /* 1 seconds */); 
       timerText.setText(secondsToString(minute)); 
      }else { 
       Thread myThread = new Thread(myRunnable); 
       myThread.start(); 
      } 
     } 
    }; 

答えて

2

代わりのAsyncTaskを使用して、あなたはThread sおよびRunnable Sを使用することができます。

あなたがバックグラウンドで実行したいあなたのコードは、配置されてRunnable作成します。

Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     // your code 
    } 
} 

があなたのThreadを作成します。

private Thread myThread; 

あなたはハンドラを上に作成されていることを確認しますがメインスレッド。 最良の結果を得るために、あなたのonCreate()メソッドに追加します。

private Handler mHandler; 

@Override 
public void onCreate() { 
    // ... 
    mHandler = new Handler(); 
    // ... 
} 

あなたがandroid.os.Handlerをインポートする必要があります。

try { 
    mHandler.removeCallbacks(postRunnable); // stop current wait 
} catch(Exception ex) { 
    // Just if the above fails (might be first time) 
} 
int minutes = 5; 
mHandler.postDelayed(postRunnable, minutes * 60 * 1000 /* 5 minutes in milliseconds */); 

そして、それはそれだ:ユーザーがボタンをクリックしたときに

private Runnable postRunnable = new Runnable() { 
    @Override 
    public void run() { 
     Thread myThread = new Thread(myRunnable); 
     myThread.start(); 
    } 
} 

は今すぐ次のようにします。アップロードのコードがどこにある

は、実行可能を宣言します。

説明:ユーザーがボタンをクリックすると

、それが5秒間(UIをブロックせずに)待っています、そしてそれは、新しいスレッドを開始しpostRunnable内のコードを実行しますあなたのmyRunnableの中でコードを実行します。カウントダウンを開始するには、通知

private Handler mHandler; 
private int minutes = 5; 
private Runnable updateRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if(minutes > 0) { 
      String notifContent = "" + minutes + " remaining."; 
      // Create your notification (there are several guides which show you how to do this), use notifContent as title or text or whatsoever 
      minutes--; 
      mHandler.postDelayed(updateRunnable, 60 * 1000); 
     } else { 
      // Remove your notification 
     } 
    } 
}; 

を更新するための

編集:

mHandler.post(updateRunnable); 
+0

どういたしまして。他の問題はどういったものですか? – xdevs23

+0

ステータスバーにダウンカウンタを実装して、サーバーにファイルを送信する前にどれくらいの分/秒が残っているかを表示したいのですが... –

+0

毎分**を実行する実行可能ファイルを持つスレッドをもう1つ作成できます。実行可能ファイルが実行されるたびに 'int minutes'変数をカウントダウンします。 runnableでは、例えば、現在の 'int minutes'値で通知を表示することができます。実際には – xdevs23

関連する問題