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
  • 电影活动
在MainActivity中,我创建了从第二个视图获取一些信息的意图:

 @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");

 ...
 }