Reputation: 21
I have a timer app for school and I tried to make widget timer and I did it. But I noticed a problem 2 days ago: sometimes widget stops working and does not continue. When I delete and create another widget, it continues to work. However, this is a big problem for me so I'm trying to solve it. I searched everywhere but I couldn't find anything about it.
How can I solve this problem?
package com.candydevelopment.okulsayac;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.StrictMode;
import android.util.TypedValue;
import android.widget.ArrayAdapter;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class sayacWidget extends AppWidgetProvider {
private static final String TAG = MainActivity.class.getName();
private static final String FILENAME = "";
TextView txtStartLeftDate, txtOkulText,txttatil15leftdate,txttatil15yazi;
private long startTime,starttime15;
private long diff;
private CountDownTimer mCountDownTimer,mCountDownTimer15;
String acilmaZaman, kapanmaZaman,tatil15;
Context con;
String address = "https://www.candygaminggames.com/okulsayac.php";
InputStream is = null;
String line = null;
String result = null;
String[] data;
ArrayAdapter<String> adapter;
SharedPreferences myPreferences;
SharedPreferences.Editor myEditor;
static final int READ_BLOCK_SIZE = 100;
public void CalculateTime(final Context context, final AppWidgetManager appWidgetManager,
final int appWidgetId) {
views = new RemoteViews(con.getPackageName(), R.layout.sayac_widget);
try{
acilmaZaman=SaveGet.getValue(con,"Acilma");
kapanmaZaman=SaveGet.getValue(con,"Kapanma");
tatil15=SaveGet.getValue(con,"tatil15");
} catch (Exception ed) {
ed.printStackTrace();
}
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
formatter.setLenient(false);
Date acilmaTarih;
Date kapanmaTarih;
Date tatil15date;
long milliseconds = 0;
long milliseconds15 = 0;
try {
acilmaTarih = formatter.parse(acilmaZaman);
kapanmaTarih = formatter.parse(kapanmaZaman);
tatil15date = formatter.parse(tatil15);
milliseconds15 = tatil15date.getTime();
milliseconds = acilmaTarih.getTime();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
diff = milliseconds - startTime;
if (diff < 0) {
try {
kapanmaTarih = formatter.parse(kapanmaZaman);
milliseconds = kapanmaTarih.getTime();
diff = milliseconds - startTime;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
diff = milliseconds - startTime;
views.setTextViewText(R.id.txtOkulBilgi, "Okulun Kapanmasına Kalan");
apm.updateAppWidget(appWidgetId, views);
}
startTime = System.currentTimeMillis();
mCountDownTimer = new CountDownTimer(milliseconds, 1000 ) {
public void onTick(long millisUntilFinished) {
startTime = startTime - 1;
Long serverUptimeSeconds =
(millisUntilFinished - startTime) / 1000;
String daysLeft = String.valueOf(serverUptimeSeconds / 86400);
String hoursLeft = String.valueOf((serverUptimeSeconds % 86400) / 3600);
String minutesLeft = String.valueOf(((serverUptimeSeconds % 86400) % 3600) / 60);
String secondsLeft = String.valueOf(((serverUptimeSeconds % 86400) % 3600) % 60);
views.setTextViewText(R.id.txtAcilma,daysLeft + " : " + hoursLeft + " : " + minutesLeft + " : " + secondsLeft);
apm.updateAppWidget(WidgetID, views);
}
public void onFinish() {
}
}.start();
starttime15 = System.currentTimeMillis();
mCountDownTimer15 = new CountDownTimer(milliseconds15, 1000) {
public void onTick(long millisUntilFinishedd) {
starttime15 = starttime15 - 1;
Long serverUptimeSeconds15 =
(millisUntilFinishedd - starttime15) / 1000;
String daysLeft = String.valueOf(serverUptimeSeconds15 / 86400);
String hoursLeft = String.valueOf((serverUptimeSeconds15 % 86400) / 3600);
String minutesLeft = String.valueOf(((serverUptimeSeconds15 % 86400) % 3600) / 60);
String secondsLeft = String.valueOf(((serverUptimeSeconds15 % 86400) % 3600) % 60);
views.setTextViewText(R.id.txtAcilma2,daysLeft + " : " + hoursLeft + " : " + minutesLeft + " : " + secondsLeft);
apm.updateAppWidget(appWidgetId, views);
}
public void onFinish() {
}
}.start();
}
int WidgetID;
AppWidgetManager apm;
public void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
con = context;
apm = appWidgetManager;
WidgetID = appWidgetId;
try{
acilmaZaman=SaveGet.getValue(con,"Acilma");
kapanmaZaman=SaveGet.getValue(con,"Kapanma");
tatil15=SaveGet.getValue(con,"tatil15");
CalculateTime(context,appWidgetManager,appWidgetId);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(con,
"Lütfen ilk açılışta internete bağlanın.",
Toast.LENGTH_LONG).show();
}
}
RemoteViews views;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onEnabled(Context context) {
// Enter relevant functionality for when the first widget is created
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}`
Upvotes: 2
Views: 276
Reputation: 1746
The problem is that updating of widget's view make AppWidgetProvider. AppWidgetProvider is a BroadcastReceiver, so it's lifetime really small (10 seconds without goAsync()). So after dies AppWidgetProvider, your views will not be updated. To avoid this behaviour, make calculating date and updating widget's view from Service, that will fix your problem.
Upvotes: 1