2012-01-20 17 views
-1

私はクラスiのJavaScriptのsetIntervalのアンドロイドに相当することを知りたいのですが、例えばhttp以下のような定期的な間隔でサーバーにデータを投稿しようとしています。androidと同等のクラスのJavaScriptのsetIntervalの

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



    } 

すべての返信は歓迎している:)

LOGファイル:

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) 
+1

最初に読む...後でコードを書く...私はdeveloper.android.comウェブサイトからの全体のdevのガイドを読んで意味..そして、あなたは、UIスレッド上でのインターネット操作を行うべきではないことと、回避する方法knwon必要がありますそれはasynctask /インテントサービス – Selvin

答えて

2

私は、これはあなたが探しているものだと思う:Android scheduleAtFixedRate

+0

int initialDelay = 1000; int期間= 5000; タイマータイマー=新しいタイマー(); TimerTaskタスク= new TimerTask() { public void run() { Looper.prepare(); try { \t \t \t \t \t postData(); \t \t \t \t}キャッチ(JSONException電子){ \t \t \t \t \t // TODO自動生成されたcatchブロック \t \t \t \t \t e.printStackTrace(); \t \t \t \t Looper.loop(); Looper.myLooper()。quit(); } }; timer.scheduleAtFixedRate(task、initialDelay、period);アプリ。クラッシュしていますか? – arjun

+0

アプリがクラッシュしたときにLogCatから得られる出力は何ですか? – bschultz

+0

私はポスト、plsチェックのログを追加しました。 – arjun

0

私が思うに、あなたが使用することができ、私のクロッククラス。 タイミングを開始/停止し、登録された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); 
    } 
}