Android:自动连接到Web服务的最佳方式,无需用户交互

时间:2011-04-14 22:04:28

标签: android

我是android开发的新手,我正在做一个需要每X次自动连接到webservice的应用程序。例如,连接以每30秒检索一次数据,而无需用户的交互。

我尝试使用android.os.Handler,但是这个Object的问题在于它是在ui线程中运行的,所以当连接花费很多时间UI冻结... 我发现这样做的唯一方法是使用asynctast并在onPostexecute()中再次调用相同的Asynctask对象,类似:

公共类ScheduledAsyncTask扩展了AsyncTasc {

 doInBackground() {
    Thread.sleep(30000); //30 seconds...
    // connect to the server and retrieve data...
 }

 onPostExecute() {
    // show new data to the user
    ScheduledAsyncTask task = new ScheduledAsyncTask();
    task.execute();
 }

}

这很好但我认为不是最好的方法。欢迎提出所有建议。

提前致谢,

我身边的新例子:

我认为这是做我想做的最好的方式,请检查一下:

我的代码:

public class MainScheduledTime extends Activity实现OnClickListener {

private int counter = 0;
private int counterTemp = 0;
private TextView label;
private Button button;
private Timer timer = new Timer();
private Handler counterHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    label = (TextView) findViewById(R.id.label);
    button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this);

    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            try {

                Thread.sleep(5000); // This emulates an expensive task. For Example: call a webservice and parse the data.
                counterTemp++;
                setCounter(counterTemp); // This methods needs to be synchronized
                counterHandler.post(counterTask);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }, 0, 10000);


}

private Runnable counterTask = new Runnable() {
   public void run() {
        label.setText(getCounter() + "");
   }
};

public synchronized int getCounter() {
    return this.counter;
}

public synchronized void setCounter(int count) {
    this.counter = count;
}

@Override
public void onClick(View arg0) {

} 

}

2 个答案:

答案 0 :(得分:2)

您应该在Service中进行网络服务电话。然后,您可以使用AlarmManager

安排服务执行

答案 1 :(得分:0)

您可以简单地使用常规线程。

AsyncTask不适用于无限循环。