Skip to content

Commit ad34998

Browse files
committed
fix some crashes
1 parent b89715a commit ad34998

File tree

3 files changed

+81
-45
lines changed

3 files changed

+81
-45
lines changed

android/src/org/coolreader/crengine/BackgroundThread.java

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,31 @@ public void postGUI( Runnable task )
180180
*/
181181
public void postGUI(final Runnable task, final long delay)
182182
{
183-
if ( guiHandler==null ) {
184-
synchronized( postedGUI ) {
185-
postedGUI.add(task);
183+
try {
184+
if (guiHandler == null) {
185+
synchronized (postedGUI) {
186+
postedGUI.add(task);
187+
}
188+
} else {
189+
if (delay > 0) {
190+
final int id = ++delayedTaskId;
191+
//L.v("posting delayed (" + delay + ") task " + id + " " + task);
192+
guiHandler.postDelayed(new Runnable() {
193+
@Override
194+
public void run() {
195+
try {
196+
task.run();
197+
//L.v("finished delayed (" + delay + ") task " + id + " " + task);
198+
} catch (Throwable e) {
199+
Log.e("cr3", "Exception while processing task in GUI thread: " + task, e);
200+
}
201+
}
202+
}, delay);
203+
} else
204+
guiHandler.post(task);
186205
}
187-
} else {
188-
if ( delay>0 ) {
189-
final int id = ++delayedTaskId;
190-
//L.v("posting delayed (" + delay + ") task " + id + " " + task);
191-
guiHandler.postDelayed(new Runnable() {
192-
@Override
193-
public void run() {
194-
task.run();
195-
//L.v("finished delayed (" + delay + ") task " + id + " " + task);
196-
}
197-
}, delay);
198-
} else
199-
guiHandler.post(task);
206+
} catch (Throwable e) {
207+
Log.e("cr3", "Exception while posting task to GUI thread: " + task, e);
200208
}
201209
}
202210

@@ -225,14 +233,30 @@ public static boolean isBackgroundThread()
225233
return (Thread.currentThread() == instance);
226234
}
227235

228-
public void executeGUI( Runnable task )
236+
public void executeGUI( final Runnable task )
229237
{
230238
//Handler guiHandler = guiTarget.getHandler();
231239
//if ( guiHandler!=null && guiHandler.getLooper().getThread()==Thread.currentThread() )
232-
if (isGUIThread())
233-
task.run(); // run in this thread
234-
else
235-
postGUI(task);
240+
try {
241+
if (isGUIThread())
242+
task.run(); // run in this thread
243+
else {
244+
postGUI(new Runnable() {
245+
@Override
246+
public void run() {
247+
try {
248+
task.run();
249+
} catch (Throwable e) {
250+
Log.e("cr3",
251+
"Exception while executing task in GUI thread: " + task, e);
252+
}
253+
254+
}
255+
});
256+
}
257+
} catch (Throwable e) {
258+
Log.e("cr3", "Exception in executeGUI: " + task, e);
259+
}
236260
}
237261

238262
public <T> Callable<T> guard( final Callable<T> task )

android/src/org/coolreader/crengine/ReaderView.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4901,7 +4901,8 @@ public void fail(Exception e) {
49014901
mActivity.waitForCRDBService(new Runnable() {
49024902
@Override
49034903
public void run() {
4904-
Services.getHistory().removeBookInfo(mActivity.getDB(), mBookInfo.getFileInfo(), true, false);
4904+
if (Services.getHistory() != null)
4905+
Services.getHistory().removeBookInfo(mActivity.getDB(), mBookInfo.getFileInfo(), true, false);
49054906
}
49064907
});
49074908
mBookInfo = null;

android/src/org/coolreader/db/CRDBServiceAccessor.java

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
public class CRDBServiceAccessor {
1616
private final static String TAG = "cr3db";
1717
private Activity mActivity;
18-
private CRDBService.LocalBinder mService;
19-
private boolean mServiceBound;
18+
private volatile CRDBService.LocalBinder mService;
19+
private volatile boolean mServiceBound;
2020
private MountPathCorrector pathCorrector;
2121

2222
public CRDBService.LocalBinder get() {
@@ -30,7 +30,7 @@ public CRDBServiceAccessor(Activity activity, MountPathCorrector pathCorrector)
3030
this.pathCorrector = pathCorrector;
3131
}
3232

33-
public void setPathCorrector(MountPathCorrector pathCorrector) {
33+
public synchronized void setPathCorrector(MountPathCorrector pathCorrector) {
3434
this.pathCorrector = pathCorrector;
3535
if (mService != null && pathCorrector != null)
3636
mService.setPathCorrector(pathCorrector);
@@ -40,15 +40,20 @@ public void setPathCorrector(MountPathCorrector pathCorrector) {
4040

4141
private boolean bindIsCalled;
4242
public void bind(final Runnable boundCallback) {
43-
if (mService != null) {
44-
Log.v(TAG, "CRDBService is already bound");
45-
if (boundCallback != null)
46-
boundCallback.run();
47-
return;
48-
}
43+
synchronized(this) {
44+
if (mService != null) {
45+
Log.v(TAG, "CRDBService is already bound");
46+
if (boundCallback != null)
47+
boundCallback.run();
48+
return;
49+
}
50+
}
4951
//Log.v(TAG, "binding CRDBService");
50-
if (boundCallback != null)
51-
onConnectCallbacks.add(boundCallback);
52+
if (boundCallback != null) {
53+
synchronized(onConnectCallbacks) {
54+
onConnectCallbacks.add(boundCallback);
55+
}
56+
}
5257
if (!bindIsCalled) {
5358
bindIsCalled = true;
5459
if (mActivity.bindService(new Intent(mActivity,
@@ -73,21 +78,27 @@ public void unbind() {
7378

7479
private ServiceConnection mServiceConnection = new ServiceConnection() {
7580
public void onServiceConnected(ComponentName className, IBinder service) {
76-
mService = ((CRDBService.LocalBinder)service);
77-
Log.i(TAG, "connected to CRDBService");
78-
if (pathCorrector != null)
79-
mService.setPathCorrector(pathCorrector);
80-
if (onConnectCallbacks.size() != 0) {
81-
// run once
82-
for (Runnable callback : onConnectCallbacks)
83-
callback.run();
84-
onConnectCallbacks.clear();
85-
}
81+
synchronized(CRDBServiceAccessor.this) {
82+
mService = ((CRDBService.LocalBinder) service);
83+
Log.i(TAG, "connected to CRDBService");
84+
if (pathCorrector != null)
85+
mService.setPathCorrector(pathCorrector);
86+
}
87+
synchronized(onConnectCallbacks) {
88+
if (onConnectCallbacks.size() != 0) {
89+
// run once
90+
for (Runnable callback : onConnectCallbacks)
91+
callback.run();
92+
onConnectCallbacks.clear();
93+
}
94+
}
8695
}
8796

8897
public void onServiceDisconnected(ComponentName className) {
89-
mService = null;
90-
Log.i(TAG, "disconnected from CRDBService");
98+
synchronized(CRDBServiceAccessor.this) {
99+
mService = null;
100+
}
101+
Log.i(TAG, "disconnected from CRDBService");
91102
}
92103
};
93104

0 commit comments

Comments
 (0)