Android-эквивалент для setInterval JavaScript для класса - PullRequest
0 голосов
/ 20 января 2012

Я хочу знать, что такое Android-эквивалент для setInterval javascript для класса. Я пытаюсь http отправлять данные на сервер через равные промежутки времени, например, на 10 секунд ниже приведен код.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tv=(TextView)findViewById(R.id.textview);
    text    = "";

    try {
        postData(); // display the data

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}



   public void postData() throws JSONException{  
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        final Random myRandom = new Random();
        HttpPost httppost = new HttpPost("http://mywebpage.com/index.php?id="+myRandom.nextInt(100000));
        JSONObject json = new JSONObject();

        try {

            JSONArray postjson=new JSONArray();
            postjson.put(json);

            // Post the data:
            StringEntity se = new StringEntity( "JSON: " + json.toString());  
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            httppost.setEntity(se);

            // Execute HTTP Post Request
            System.out.print(json);
            HttpResponse response = httpclient.execute(httppost);

            // for JSON:
            if(response != null)
            {
                InputStream is = response.getEntity().getContent();

                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();

                String line = null;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                text = sb.toString();
            }

            tv.setText(text);

        }catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }        



    int initialDelay = 1000;
    int period = 5000;
    Timer timer = new Timer();
    TimerTask task = new TimerTask() { 
   public void run() {
    Looper.prepare();
    try { 
   postData(); 
   } 
   catch (JSONException e) { 
   // TODO Auto-generated catch block
    e.printStackTrace(); 
   } 
   Looper.loop(); 
   Looper.myLooper().quit();
    } 
   };
    timer.scheduleAtFixedRate(task, initialDelay, period);



    }

все ответы приветствуются:)

ФАЙЛ ЛОГА:

01-21 02:07:30.441: W/dalvikvm(575): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
01-21 02:07:30.451: E/AndroidRuntime(575): FATAL EXCEPTION: Timer-0
01-21 02:07:30.451: E/AndroidRuntime(575): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.view.View.invalidate(View.java:5139)
01-21 02:07:30.451: E/AndroidRuntime(575):  at android.widget.TextView.checkForRelayout(TextView.java:5364)

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Я думаю, это то, что вы ищете: Расписание AndroidAtFixedRate

0 голосов
/ 31 января 2012

Я думаю, вы могли бы использовать мой класс часов. Он запускает / останавливает время и показывает время и / или дату в зарегистрированных полях TextView.

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import android.os.Handler;
import android.widget.TextView;
/**
 * The class for creating and refreshing many different fields on different layouts,
 * that can hold actual time and/or date in different formats 
 * The formats should be as in http://developer.android.com/reference/java/text/SimpleDateFormat.html. 
 * Only present and visible fields are being actualized, so there is no need to clean the clock list after closing an activity
 * 
 * Examples of use:
 * 
 *      Clock.registerClock((TextView) findViewById(R.id.TimeField), "HH:mm");
 *      Clock.registerClock((TextView) findViewById(R.id.DateField), "d.M.yyyy EEE");
 *      Clock.start(10000L);
 *
 * @author Petr Gangnus
 */
public final class Clock {
    /**
     * the handler that works instead of timer and supports UI
     */
    static private Handler handler = new Handler();
    /**
     * the interval of the time refreshing
     */
    static private long refreshStep;

    /**
     * pairs TextView timer+time/date format
     */
    private TextView clockFace;
    private String format;
    private Clock(TextView clockFace, String format){
        this.clockFace=clockFace;
        this.format=format;
    }
    // here is the list of views containing the visual timers that should be held actual
    static private ArrayList<Clock> clocks=new ArrayList<Clock>();
    /**
     * fills all timer fields by actual time value, according to their formats.
     */
    static private Runnable mUpdateTimeTask = new Runnable() {
       public void run() {
           for(Clock clock:clocks){
               showActualTimeDate(clock);
           }
           handler.postDelayed(this,refreshStep);
       }
    };

    //============================================ public members ====================================================================
    /**
     * add a clock to the list of updating clocks
     * @param clockFace - the place where the time or date will be shown 
     * @param format - the format of the time/date 
     * @return
     */
    public static boolean registerClock(TextView clockFace, String format){
        if (clockFace==null) return false;
        if(clocks.contains(clockFace)){
            // old clockFace
            clocks.get(clocks.indexOf(clockFace)).format=format;
        } else {
            // new clockFace
            clocks.add(new Clock(clockFace, format));
        }
        return true;
    }
    /**
     * remove a clock from the updating list
     * @param clockFace
     * @return
     */
    public static boolean unRegisterClock(TextView clockFace){
        if (clockFace==null) return false;
        if(clocks.contains(clockFace)){
            // found clockFace
            clocks.remove(clocks.indexOf(clockFace));
        } else {
            // not found clockFace
            return false;
        }
        return true;
    }
    /**
     * put in the "place" the actual date/time in the appropriate "format"
     * @param place
     * @param format
     */
    public static void showActualTimeDate(Clock clock){
        if (clock.clockFace==null) return;
        if (clock.clockFace.getVisibility()!=TextView.VISIBLE) return;
        Date thisDate=new Date();
        SimpleDateFormat df=new SimpleDateFormat(clock.format);
        clock.clockFace.setText(df.format(thisDate));
    }
    /**
     * start the ticking for all clocks
     * @param step the tick interval
     */
    public static void start(long step) { 
        refreshStep=step;
        handler.removeCallbacks(mUpdateTimeTask);
        handler.postDelayed(mUpdateTimeTask, 0);
    }
    /**
     * Stopping ticking all clocks (not removing them)
     * the calling could be put somewhere in onStop
     */
    public static void stop() { 
        handler.removeCallbacks(mUpdateTimeTask);
    }
}
...