2016-07-16 2 views
2

이 함수를 구현하고 싶습니다 : 사용자가 버튼을 클릭하면 작업이 시작되고 5 분 후에 하나의 파일이 dropbox로 보내지지만 버튼에서 다른 시간을 클릭하면 선례 작업 중단 및 새 작업 (5 분) 시작.긴 지연 AsyncTask 및 작업 다시 시작

파일을 Dropbox에 업로드하는 코드를 작성했지만 오랜 시간 (5 분)의 작업으로 작성한 코드는 작성하지 않았습니다. 어떻게 할 수 있습니까?

- 편집 - 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(); 
        } 
       } 
      } 
     }; 

* 편집을 구현했습니다.

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 */); 

.... ....에서

:

가 onSend 기능을 수정 V2의 *

의 경우 상태 표시 줄에 카운트 다운을 구현 나는이 구현 한 파일 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들과 Runnable의를 사용할 수 있습니다.

만들기 당신이 백그라운드에서 실행하려는 코드, 위치 어디 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를 가져와야합니다.

는 업로드 코드가 어디에서 실행 가능한 선언 :

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

사용자가 버튼을 클릭하면 이제 다음을 수행하십시오

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 */); 

을 그리고 그것 뿐이다.

설명 : 사용자가 버튼을 클릭하면

, 그것은 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

매분 ** **를 실행할 실행 파일로 스레드를 하나 더 만들 수 있습니다. 실행 파일이 실행될 때마다'int minutes' 변수를 카운트 다운합니다. runnable에서, 예를 들어, 현재'int minutes' 값으로 통지를 보여줄 수 있습니다. – xdevs23

관련 문제