这取决于应用程序的性质。如果这应该响应用户输入而发生...您可以使用AsyncTask。否则,后台服务也可以完成这项工作。
您永远不应该在主 UI 线程上运行网络操作和/或数据库访问。
服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(已启动、已绑定或两者兼有)。您可以阅读大量资源...这是 Android 文档中的一个...
https://developer.android.com/guide/components/services
AsyncTask 示例
下面的示例显示了AsyncTask 的实现,它从网络资源中获取用户的详细信息...
public class FetchUserTask extends AsyncTask<String,Void, UserDTO> {
private FetchUserTaskListener listener;
@Override
protected UserDTO doInBackground(String...params){
if(params == null || params.length == 0)
return null;
String userID = params[0];
UserDataProvider provider = new UserDataProvider(userID);
try {
return provider.get(userID);
}
catch(Exception ex){
//log the error
return null;
}
}
@Override
protected void onPostExecute(UserDTO user){
if(listener != null)
listener.onCompleted(user);
}
public void setListener(FetchUserTaskListener listener){
this.listener = listener;
}
public interface FetchUserTaskListener{
void onCompleted(boolean success);
}
}
你是如何使用这个 AsyncTask 的?
例如,在Activity 中,您可以按如下方式使用它...
public class UserDetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//instantiate activity...
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever_layout);
fetchUser(userId);
}
private void fetchUser(String userID){
FetchUserTask task = new FetchUserTask();
task.setListener(new FetchUserTaskListener<UserDTO>() {
@Override
public void onCompleted(UserDTO user) {
//CAUTION: make sure the activity hasn't been stopped before
//accessing any UI elements and/or context
}
}
task.execute(userID);
}
}
注意
您可以(并且将需要)使上面的示例更加复杂。例如,如果发生错误,您可以让FetchUserTaskListener 的onCompleted 方法也返回错误消息。
在访问任何上下文绑定数据之前,您还需要检查活动是否已暂停或停止,否则您可能会收到 ILlegalStateException。