在计时器Android上运行新线程

时间:2013-05-26 00:17:08

标签: android multithreading timer

我一直在开发一个Android应用程序,它定期使用JSON检查一个mysql数据库,一切都可以正常使用我的代码。

我无法将其作为计时器运行,因为它只运行一次然后停止。 我设法运行的唯一代码在UI线程上运行http请求冻结。 非常感激任何的帮助。 提前谢谢,

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    checkUpdate.start();
    ...
}

private Thread checkUpdate = new Thread() {
    public void run() {
        try {
            // my code here to get web request to return json string
        } 

        String response = httpclient.execute(httppost, responseHandler);
                    mHandler.post(showUpdate);
    }
    ...
}


private Runnable showUpdate = new Runnable(){
    public void run(){
        try{
            // my code here handles json string as i need it
            Toast.makeText(MainActivity.this,"New Job Received...", Toast.LENGTH_LONG).show();
            showja();
        }
    }
}


private void showja(){
    Intent i = new Intent(this, JobAward.class);  
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();   
}

1 个答案:

答案 0 :(得分:1)

正如@Raghunandan建议的那样,在Android背景下执行工作的标准方法,然后在完成工作时修改UI,正在使用AsyncTask

首先定义AsyncTask的新子类:

private class JsonRequestTask extends AsyncTask<HttpUriRequest, Void, String> {
     protected String doInBackground(HttpUriRequest... requests) {
         // this code assumes you only make one request at a time, but
         //   you can easily extend the code to make multiple requests per
         //   doInBackground() invocation:
         HttpUriRequest request = requests[0];

         // my code here to get web request to return json string

         String response = httpclient.execute(request, responseHandler);
         return response;
     }

     protected void onPostExecute(String jsonResponse) {
        // my code here handles json string as i need it
        Toast.makeText(MainActivity.this, "New Job Received...", Toast.LENGTH_LONG).show();
        showja();  
     }
 }

然后您将使用此类任务,而不是Thread

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    JsonRequestTask task = new JsonRequestTask();
    task.execute(httppost);
    ...
}

您只需创建new JsonRequestTask()并调用其execute()方法即可再次运行该任务。

像这样的简单异步任务的一个常见做法是使其成为使用它的Activity类中的私有内部类(如果只有一个Activity需要它)。您可能需要更改某些活动变量的范围,以便内部类可以使用它们(例如,将局部变量移动到成员变量)。