2016-05-25 17 views
0

Ich erstelle eine Anwendung mit vielen Fragmenten. In meinem letzten Fragment versuche ich nach 10 Sekunden etwas auf LogCat zu drucken. Aber es funktioniert nicht für mich.Wie führe ich eine Aufgabe nach einem bestimmten Zeitraum in Android aus?

Das ist mein Fragment Klasse

public class StepTwentyTwoFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.step22_fragment, container, false); 

     testMethod(); 
     return v; 
    } 

    public static StepTwentyTwoFragment newInstance() { 

     StepTwentyTwoFragment f = new StepTwentyTwoFragment(); 
     Bundle b = new Bundle(); 

     f.setArguments(b); 

     return f; 
    } 


    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser) { 
      Activity a = getActivity(); 
      if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
    } 

    public void testMethod(){ 
     SystemClock.sleep(10000); 
     Log.d("PPP : ","456"); 
    } 

} 

Eigentlich dieses "PPP", nachdem ich drucken möchten 10 Sekunden, wenn letzte Fragment gestartet wird. Aber es beginnt mit dem Laden einiger Fragmente in der Anwendung zu drucken.

Haben Sie irgendwelche Ideen dazu?

Vielen Dank.

+0

Nicht 'schlafen'. Sie können die Methode ['postDelayed'] (https://developer.android.com/reference/android/view/View.html#postDelayed%28java.lang.Runnable,%20long%29) Ihres' View v' verwenden Sie haben in 'onCreateView', um ein' Runnable' zu ​​planen, das schließlich die Protokollnachricht ausgibt. Oder Sie können einen Handler verwenden. – zapl

+0

@zapl: Erklären Sie mehr mit einem Beispiel. – Barrier

Antwort

2

Sie sollten nicht schlafen, noch Threads erstellen, wenn Sie sie nicht brauchen. Der Hauptthread von Android basiert auf einer Ereignisschleife und Sie können Ereignisse/Code planen, die zu einem späteren Zeitpunkt ausgeführt werden sollen.

Ihre einfachste Option ist

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.step22_fragment, container, false); 
    Runnable delayedTask = new Runnable() { 
     @Override 
     public void run() { 
      Log.d("PPP : ","456"); 
     } 
    }; 
    v.postDelayed(delayedTask, 10000); 
    return v; 
} 

verwenden Wenn Sie auch keine View haben können Sie Ihre eigenen Handler erstellen.

private static final Handler mainThreadHandler = new Handler(Looper.getMainLooper()); 
public void testMethod(){ 
    Runnable delayedTask = new Runnable() { 
     @Override 
     public void run() { 
      Log.d("PPP : ","456"); 
     } 
    }; 
    mainThreadHandler.postDelayed(delayedTask, 10000); 
} 
+0

Vielen Dank, mein Lieber. – Barrier

+0

Dies funktioniert nur einmal. Wie konnte es passieren? – Barrier

+0

@Barrier 'onCreateView' wird nicht immer aufgerufen, wenn das Fragment erneut angezeigt wird (da die Ansicht nicht immer neu erstellt wird). Verschiebe es auf 'onStart' oder' onResume'. – zapl

1

Wahrscheinlich schläfst du den UI-Thread, deshalb erscheint dein Log nach dem Ende des Schlafs.

Verwenden Sie Timer und TimerTask. TimerTask wird auf einem anderen Thread als dem ui-Thread ausgeführt.

Timer timer   = new Timer(); 
TimerTask timer_task = new TimerTask() { 
    @Override 
    public void run() { 
     Log.d("PPP : ","456"); 
    } 
}; 
timer.schedule(timer_task, 10000); 
1

versuchen diese

public void executePeriodicTask() { 
final Handler handler = new Handler(); 
Timer timer = new Timer(); 
TimerTask doAsynchronousTask = new TimerTask() {  
    @Override 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() {  
       try { 

        //Write your code here , which you want to execute periodically 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
       } 
      } 
     }); 
    } 
}; 
timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms 

}

1

Sie einfach einen Thread oder Handler für das Erstellen kann.

Wenn Sie Thema verwenden möchten ->

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) {} 
     ((Activity)getActivity()).runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Log.d("PPP : ","456"); 
       // Do other Stuff 
      } 
     }); 
    } 
}).start(); 
1

können Sie Handler verwenden mit PostDelayedRunnable es

new Handler().postDelayed(new Runnable(){ 
     @Override 
     public void run() { 

      Log.d("PPP : ","456"); 
     } 
    }, 10000); 
2

Verwendung Handler.postDelayed Methode übergeben, dies zu erreichen.

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    //Do something after 10000ms 

    } 
}, 10000); 

Platzieren Sie den Code, den Sie im Vorfeld ausgeführt werden soll() von here mehr über Handlers method.Read