gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:17:25 26 4
gpt4 key购买 nike

我想创建一项服务,如果有任何未读的 SMS,则每 20 秒检查一次我的 SMS,然后将其发送到我的网站,然后标记为已读以将数据发布到我使用 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) {}
}
}
}

最佳答案

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

关于android - 无法从服务内部的线程中调用 runOnUiThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com