1

JSONを使用してmysqlデータベースを定期的にチェックするAndroidアプリに取り組んでおり、すべてが私のコードで正常に動作します。

一度だけ実行して停止するため、これをタイマーとして実行するのに問題があります。私が何とか機能させることができた唯一のコードは、フリーズする 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();   
}
4

1 に答える 1

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にすることです (1 つだけActivity必要な場合)。内部クラスがそれらを使用できるように、アクティビティの変数の一部のスコープを変更する必要がある場合があります (たとえば、ローカル変数をメンバー変数に移動します)。

于 2013-05-26T21:03:06.963 に答える