بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
مشکل در اجرای BackgroundService
سلام خسته نباشید
من تو برنامه نیاز دارم که هر چند دقیقه یک بار یه عدد از سرور دریافت بشه و اگه عدد از عدد قبلی بزرگتر بود اطلاعات کامل دریافت بشه
// برای اینکه حجم اطلاعات دریافتی زیاد نباشه در مرحله اول عدد رو چک میکنم که اگه بزرگتر نبود نیازی به خوندن اطلاعات هم نباشه
الان مشکلم اینجاست که سرویس بعضی مواقع کار میکنه و بعضی مواقع هم کار نمیکنه ، دیر و زود بودنش به خاطر مشکلات سرور میتونه باشه ولی اینکه اصلا نوتیفیکیشن ارسال نشه دلیلش چیه ؟
کد سرویسم ایناست ، مشکلی داره ؟
public class BackgroundService extends Service {
String thumbnail,title;
static int oldCount,newPostCount,postID;
public static ArrayList<postStruct> tempPost = new ArrayList<postStruct>();
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
new getCount().execute();
}
}, 0, 10000);}
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {}
@Override
public void onLowMemory() { }
protected void displayNotification(String newPost , Bitmap thumbnail,int notifyID) {
}
class getCount extends AsyncTask<Void, Void, String>
{
protected void onPreExecute() {}
protected String doInBackground(Void... params) {
StringBuilder content = new StringBuilder();
try {
URL url = new URL(getResources().getString(R.string.siteURL) + "/service.php?action=count");
URLConnection urlConnection = url.openConnection();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
content.append(line);
}
bufferedReader.close();
} catch (Exception e) {e.printStackTrace();}
return content.toString();
}
protected void onPostExecute(String result) {
try {
JSONObject response = new JSONObject(result);
if ( response.getInt("Count") > oldCount ){
new loadContent().execute();
response.getInt("Count");
}else
response.getInt("Count");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
class loadContent extends AsyncTask<Void, Void, String>
{
protected void onPreExecute() {}
protected String doInBackground(Void... params) {
StringBuilder content = new StringBuilder();
try {
URL url = new URL(getResources().getString(R.string.siteURL) + "/service.php?action=read&page=1");
URLConnection urlConnection = url.openConnection();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
content.append(line);
}
bufferedReader.close();
} catch (Exception e) {e.printStackTrace();}
return content.toString();
}
protected void onPostExecute(String result) {
LoadNew(result);
}
}
void LoadNew(String data) {
final Bitmap[] image = new Bitmap[1];
try {
JSONObject response = new JSONObject(data);
JSONArray posts = response.getJSONArray("posts");
newPostCount=response.getInt("Count")- oldCount;
for (int i =0;i<newPostCount;i++){
tempPost.clear();
// دستورات برای دریافت اطلاعات و واریز به آرایه
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(thumbnail);
image[0] = BitmapFactory.decodeStream(url.openConnection().getInputStream());
} catch (IOException e) {e.printStackTrace();}
}
}).start();
while (true){if (image[0] !=null) break;}
displayNotification(title, image[0],postID);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
ممنون
0
0
2 تا AsyncTask گذاشتم که اولی فقط عدد رو دریافت میکنه و اگه عدد بزرگتر بود دومی اجرا میشه و اطلاعات رو میخونه و در نهایت با تابع displayNotification یک نوتیفیکیشن ارسال میشه
(10 سال پیش)
+1
0
من کد شما رو نگاه نکردم چون به نظرم این کار اشتباه هست که هر چند وقت یکبار بخوایم با سرور ارتباط بر قرار کنیم مگر در شرایط خاص که فکر نمیکنم برنامه شما هم شامل اون شرایط بشه ، اگر برنامه شما باز هست پس دیگه نیازی به سرویس ندارید و اگر باز نیست و در این لحظه میخواید بررسی رو انجام بدید به نظرم کار صحیح این هست که یک برودکست بذارید برای بررسی نتورک و در صورتیکه اتصال برقرار بود یکبار اطلاعات مورد نیاز رو از سرور بخونید و یا با استفاده از Thread درخواستتون رو تکرار کنید . (10 سال پیش)
برای این سوال پاسخی وجود ندارد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .