Java 如何以异步方式在类之间发送数据?
我需要知道怎么做 我有两种看法Java 如何以异步方式在类之间发送数据?,java,android,android-room,Java,Android,Android Room,我需要知道怎么做 我有两种看法 ActivityMain.java 电影活动 在MainActivity中,我创建了从第二个视图获取一些信息的意图: @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); CustomGridviewAdapter customGridviewAdapter = new CustomGridviewAdapte
- ActivityMain.java
- 电影活动
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
CustomGridviewAdapter customGridviewAdapter = new CustomGridviewAdapter(filmList, getApplicationContext());
simpleGrid.setAdapter(customGridviewAdapter);
simpleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), FilmActivity.class);
intent.putExtra("FilmBoster", filmList.get(position).getBackdrop_path())
.putExtra("FilmImage", filmList.get(position).getPoster_path())
.putExtra("FilmName", filmList.get(position).getTitle())
.putExtra("FilmDate", filmList.get(position).getRelease_date())
.putExtra("FilmDisc", filmList.get(position).getOverview())
.putExtra("isFavFilm", filmList.get(position).getIsLiked());
startActivityForResult(intent, 2);
}
});
}
我在MainActivity中使用了AsyncTask
。第二个活动在onActivityResult中发送了数据,但是(onActivityResult)在AsyncTask之后执行,在AsyncTask中,我在DB上设置了一些数据。因此,从第二个活动返回的数据等于null
一些代码可以帮助您
@NonNull
private String convertToString(InputStream in) {
String res = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sd = new StringBuilder();
try {
while ((res = reader.readLine()) != null) {
sd.append(res).append("/n");
}
} catch (IOException e) {
e.printStackTrace();
}
parseString(sd.toString());
db.userDao().updateFilmList(filmList);
return sd.toString();
}
private void parseString(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonArray = jsonObject.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject filmObject = jsonArray.getJSONObject(i);
Film film = new Film(filmObject.getString("title")
,filmObject.getString("overview")
, filmObject.getString("poster_path")
, filmObject.getString("release_date")
,db.userDao().getIsFave());
filmList.add(film);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@NonNull
私有字符串convertToString(输入流输入){
字符串res=“”;
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
StringBuilder sd=新的StringBuilder();
试一试{
而((res=reader.readLine())!=null){
sd.append(res.append(“/n”);
}
}捕获(IOE异常){
e、 printStackTrace();
}
parseString(sd.toString());
db.userDao().updateFilmList(电影列表);
返回sd.toString();
}
私有void解析字符串(字符串json){
试一试{
JSONObject JSONObject=新的JSONObject(json);
JSONArray JSONArray=jsonObject.getJSONArray(“结果”);
for(int i=0;i
这是AsyncTask中将数据保存到db的两个方法
如果我想在AsyncTask上返回数据并将其设置为DB,我应该怎么做 您必须使用异步任务吗?我建议改用RxJava 但是,您可以创建一个扩展AsyncTask的类,并在构造函数中发送上下文,以便在onPostExecute中设置结果并完成当前活动
示例:在MainActivity类的onCreate或onResume方法中执行以下操作:
// filmList should be an empty array at this point
CustomGridviewAdapter customGridviewAdapter = new CustomGridviewAdapter(filmList, getApplicationContext());
simpleGrid.setAdapter(customGridviewAdapter);
simpleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), FilmActivity.class);
intent.putExtra("FilmBoster", filmList.get(position).getBackdrop_path())
.putExtra("FilmImage", filmList.get(position).getPoster_path())
.putExtra("FilmName", filmList.get(position).getTitle())
.putExtra("FilmDate", filmList.get(position).getRelease_date())
.putExtra("FilmDisc", filmList.get(position).getOverview())
.putExtra("isFavFilm", filmList.get(position).getIsLiked());
startActivityForResult(intent, 2);
}
});
onItemClicked处理程序将单击的项目发送到FilmActivity.java类活动。在该活动的onCreate中,您需要从MainActivity读取传递给它的数据:
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.film_activity_layout);
FilmName = (String) getIntent().getExtra("FilmName");
...
}
您需要显示MainActivity中的onActivityResult代码Ok这是正确的,但我如何才能在db中设置此数据?我假设AsyncTask的其余部分有用于将数据检索到filmList数组中的代码?看到这些代码会有很大帮助。该代码正在连接到数据库并从中读取,可能使用http GET请求。要向数据库添加数据,您需要发出http POST请求;要更新数据库中已有的数据,您需要发出http PUT请求。所有这些都假设您正在使用RESTful API访问数据库。
CustomGridviewAdapter customGridviewAdapter = new CustomGridviewAdapter(filmList, getApplicationContext());
simpleGrid.setAdapter(customGridviewAdapter);
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.film_activity_layout);
FilmName = (String) getIntent().getExtra("FilmName");
...
}