无法从服务内部调用线程中的runOnUiThread

时间:2013-09-22 20:08:18

标签: android service android-asynctask

我想制作一项服务,每隔20秒检查一次我的短信,如果有任何未读的短信,然后发送到我的网站,然后标记为读取,以便将数据发布到我使用asynctask的网站,当我尝试手动时它工作正常(通过按钮点击类型应用程序) 但是在副业中我不能定义

runOnUiThread(new Runnable() {
            @Override
            public void run() { new MyAsyncTask().execute(sender,time,message);}
        });

它无法识别并要求我定义runOnUiThread 有没有办法从我在下面代码中调用的地方调用我的asynctask

public class TestService extends Service {

    String sender = null;
    String time = null;
    String message = null;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        Toast.makeText(getApplicationContext(), "Service Created", 1).show();
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Toast.makeText(getApplicationContext(), "Service Destroy", 1).show();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(getApplicationContext(), "Service Running ", 1).show();
        new Thread(new Runnable() {

            public void run() {
                ContentValues values = new ContentValues();
                Uri mSmsinboxQueryUri = Uri.parse("content://sms/inbox");
                String[] columns = new String[] { "_id", "thread_id",
                        "address", "person", "date", "body", "type" };
                Cursor cursor1 = getContentResolver().query(mSmsinboxQueryUri,
                    null, "read=0", null, null);
                DateFormat formatter = new SimpleDateFormat(
                    "dd/MM/yyyy hh:mm:ss.SSS");
                Calendar calendar = Calendar.getInstance();
                if (cursor1.getCount() > 0) {
                    cursor1.moveToFirst();
                    do {
                        // Retrieving sender number
                        sender = (cursor1.getString(cursor1
                            .getColumnIndex(columns[2])).toString());
                        // Retriving time of reception
                        long ms = cursor1.getLong(cursor1
                            .getColumnIndex(columns[4]));
                        calendar.setTimeInMillis(ms);
                        time = formatter.format(calendar.getTime()).toString();
                        // Retriving the message body
                        message = (cursor1.getString(cursor1
                            .getColumnIndex(columns[5])).toString());
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                new MyAsyncTask()
                                    .execute(sender, time, message);
                            }
                        });
                    } while (cursor1.moveToNext());// end of while
                }// end of if
                    // set as read
                values.put("read", true);
                getContentResolver().update(Uri.parse("content://sms/inbox"),
                    values, null, null);
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

    private class MyAsyncTask extends AsyncTask<String, Integer, Double> {

        @Override
        protected Double doInBackground(String... params) {
            postData(params[0], params[1], params[2]);
            return null;
        }

        protected void onPostExecute(Double result) {
            // pb.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), "command sent",
                Toast.LENGTH_LONG).show();
        }

        protected void onProgressUpdate(Integer... progress) {
            // pb.setProgress(progress[0]);
        }

        public void postData(String sender, String time, String message) {
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                "http://www.mysite.co.nf/reciever.php");
            try {
                // Add your data
                List<NameValuePair> nameValuePairs = 
                                                new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("sender", sender));
                nameValuePairs.add(new BasicNameValuePair("time", time));
                nameValuePairs.add(new BasicNameValuePair("message", message));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                // Execute HTTP Post Request
                HttpResponse response = httpclient.execute(httppost);
            } catch (ClientProtocolException e) {} catch (IOException e) {}
        }
    }
}

1 个答案:

答案 0 :(得分:54)

Service没有名为runOnUiThread()的方法。您假设Activity中的方法也是为Service定义的,但事实并非如此。

解决方案,只需定义一个完全相同的方法。这是一个简化的示例,其余代码将保持不变。

import android.os.Handler;

public class TestService extends Service {

    Handler handler;

    @Override
    public void onCreate() {
        // Handler will get associated with the current thread, 
        // which is the main thread.
        handler = new Handler();
        super.onCreate();
    }

    private void runOnUiThread(Runnable runnable) {
        handler.post(runnable);
    }

}

有关详细信息,请see the docs for Handler。它用于将一些工作转储到特定的线程上。在这种情况下,Handler与UI线程相关联,因为UI线程始终调用Service.onCreate()