这是第一次发布问题。刚开始编程和编码我的第一个应用程序
我有一个Application类文件,其文件方法为fetchUpdates():
public synchronized void fetchUpdates() {
String[] mURLs = getURLs();
new DownloadJSONData().execute(mURLs[0], mURLs[1]);
}
DownloadJSONData是一个asyncTask
,它从服务器获取更新,onPostExecute
方法使用服务器中的JSON数组更新sqlite数据库。
应用程序的不同组件(小部件和活动)调用此方法从服务器获取更新以更新数据库。
问题:synchronized方法是否在与UI线程不同的线程上运行?如果是这样,将DownloadJSONData
中的代码移动到同步fetchUpdates()
方法中应该没有问题吗?如果在连接服务器或从服务器下载数据时存在持续性,它不应该阻止UI线程吗?
动机:我正在尝试更改fetchUpdates()
方法以返回指示数据库是否已更新的布尔值。但是,现在(我认为)fetchUpdates()
方法在asyncTask
的{{1}}方法之前完成,因此,onPostExecute
方法无法指示是否调用{{ 1}}更新了数据库。如果数据库在调用后更新,我需要调用fetchUpdates()
方法的应用程序组件以不同的方式运行。
P.S。由于我是编程新手,因此简单而详细的解释会非常有用。
谢谢!
答案 0 :(得分:6)
不,同步方法在同一个线程中运行。但是,在执行时,没有其他线程可以执行另一个同步方法(同一对象)。
答案 1 :(得分:1)
使用AsyncTask
意味着大多数情况下调用方法不会立即知道结果 - 除非您调用AsyncTask.get()
但是您不想这样做并且松开异步方面。
假设您希望在数据库更新时向用户显示一条消息,您应该执行的操作是启动AsyncTask
并让它通过覆盖正确的方法来处理数据库更新的返回状态。我还会在两个不同的任务中将请求分离到服务器和数据库更新:
public class CallServer extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
// Do your request to the server
return null;
}
@Override
protected void onPostExecute(Void result) {
if (result == SUCCESS) {
// Display message to indicate successful request
new UpdateDatabase().execute(params);
} else {
// Display error message or whatever you want to do
}
}
}
public class UpdateDatabase extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
// Update the DB
return null;
}
@Override
protected void onPostExecute(Void result) {
if (result == SUCCESS) {
// Display success message or whatever you want to do
} else {
// Display error message or whatever you want to do
}
}
}
主要思想是AsyncTask
应该处理错误/成功案例,而不是其调用者。