当前位置: 首页 > 知识库问答 >
问题:

Android:异步任务线程Hibernate错误

简培
2023-03-14

我在StackOverflow的职业生涯中有一个第一个问题。我希望是你帮我。

发生了什么:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.recycler_view, container, false);
    recyclerView = (RecyclerView) view.findViewById(R.id.my_recycler_view);
    textViewErrorMsg = (TextView) view.findViewById(R.id.tv_error_message);
    progressBarLoading = (ProgressBar) view.findViewById(R.id.pb_loading);
    new TakeDates().execute();
    return view;
}
@SuppressLint("StaticFieldLeak")
class TakeDates extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        progressDialog.setMessage("Loading places...");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            Thread.sleep(2200);
            populateFromJson();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (progressDialog.isShowing())
            progressDialog.dismiss();
    }

}
 private void populateFromJson() {
    ConnectivityManager conMgr = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    assert conMgr != null;
    NetworkInfo i = conMgr.getActiveNetworkInfo();
    if (i != null && i.isConnected() && i.isAvailable()) {
        ApiService api = RetroClient.getApiService(PLACES_URL);

        Call<PlaceList> call = api.getMyJSON();

        call.enqueue(new Callback<PlaceList>() {
            @Override
            public void onResponse(Call<PlaceList> call, Response<PlaceList> response) {
                if (response.isSuccessful()) {
                    itemList = response.body().getItemList();
                    adapter = new RecyclerViewPlaceAdapter(itemList, getContext());
                    recyclerView.setAdapter(adapter);
                    recyclerView.setHasFixedSize(true);
                    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                    showPlaces();
                } else {
                    showErrorMessage("Try to restart your app.");
                }
            }

            @Override
            public void onFailure(Call<PlaceList> call, Throwable t) {
                showErrorMessage("Here is the main error: " + t.getMessage() + "\nTry to restart your app.");
            }
        });
    } else {
        showErrorMessage("Internet Connection Not Available" + "\nTry to find better connection to the internet.");
    }
}
@Override
    protected Void doInBackground(Void... voids) {
        try {
            Thread.sleep(2200); 
            populateFromJson();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

共有1个答案

华飞驰
2023-03-14

populateFromJSON()尝试使用recicleview。视图(和视图子类)对象不能从活动线程以外的任何线程使用。

在AsyncTask上执行.execute()时,onpreexecuteonpostexecute将由活动线程执行,doinbackground由子线程执行。

一旦了解了这一点,您就很容易理解,为了避免该错误,您应该在onPostExecute中调用populateFromjson()

N.B.如果您的doInBackground方法真的需要等待,那么有更有效的方法可以做到这一点。看看这里和这里

 类似资料:
  • 我是从我的应用程序连接到互联网的小新,所以我得到了这个错误,我的代码在这里。 UyariPencerem 和kulaniciKontrol 和 islemTamam 代码 感谢您的帮助...

  • 这是在一次Android采访中被问到的。有人问我是否可以从异步任务 1 的 doInBackground() 方法(让它成为 Task1)启动另一个异步任务(让它成为 Task2)。我浏览了文档,其中说了以下内容: 必须在UI线程上创建任务实例。 必须在 UI 线程上调用 execute(Params...)。 根据这些陈述,我认为从另一个任务的后台方法启动一个任务是不可能的。此外,async任务

  • 这可能是一个更巧妙的问题,但我在ViewComponent类中有以下方法 所以我的问题是我应该采取什么方法?让异步在那里与警告无关,还是有一个解决方案/修复这个警告?它对我的项目有那么大的影响吗? 谢了!

  • 本文向大家介绍Django异步任务线程池实现原理,包括了Django异步任务线程池实现原理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中

  • 我有一个应用程序,它使用JSON定期(固定时间间隔,20秒)从服务器请求数据。 我目前的实现包括在一个异步任务中有一个循环,有一个20秒的“睡眠”条件。然而,这似乎不是一个好的实现。我的问题是有没有更好的实施方案。还有,有没有一种好的方法可以从主线程中强制停止异步任务。? 另一种选择是更改代码,让客户机发送一个请求,让服务器让服务器循环返回答案。哪一种更好的实施方式提前感谢:)

  • 本文向大家介绍Android的异步任务AsyncTask详解,包括了Android的异步任务AsyncTask详解的使用技巧和注意事项,需要的朋友参考一下 AsyncTask,顾名思义,异步任务。说到异步,最简单的理解就是不同步。再复杂一点理解,就得举例子了。 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证。怎么办?怎么办! 想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不