Java doInBackground不在Activity onCreate内部运行

Java doInBackground不在Activity onCreate内部运行,java,android,arraylist,android-activity,background-process,Java,Android,Arraylist,Android Activity,Background Process,我所拥有的: 我有一个SearchActivity,它从一个片段(点击按钮后)接收ArrayList(NamedSearch),并更新一个简单的listview。单击列表视图项时,单击列表项的相应对象(orgDesObj)将显示一个新视图。此功能运行良好 当前接收列表(NamedSearch)由名称和描述组成。都是字符串 但是,我只想显示名单上的名字。因此,我尝试创建一个函数(titlefunc())。 在这里,新的ArrayList(NameDesTitles)仅用于添加相关名称 问题: 但是

我所拥有的: 我有一个SearchActivity,它从一个片段(点击按钮后)接收ArrayList(NamedSearch),并更新一个简单的listview。单击列表视图项时,单击列表项的相应对象(orgDesObj)将显示一个新视图。此功能运行良好

当前接收列表(NamedSearch)由名称和描述组成。都是字符串

但是,我只想显示名单上的名字。因此,我尝试创建一个函数(titlefunc())。 在这里,新的ArrayList(NameDesTitles)仅用于添加相关名称

问题: 但是,在调用titlefunc()时,后台函数中的Do似乎不起作用

尝试: 我放了几根圆木来抓住这一点。 我在单击的项的列表视图中也使用了相同的函数(getLocDesOb())。 令人惊讶的是,即使doInBackground函数也能工作。 但当搜索活动创建并调用titlefunc()时,doInBackground中的搜索列表(FinalDescriptionArrayList)为空()。 从日志中,我收到FinalDescriptionArrayList的内容为[],大小为0。 但是,当我单击列表视图项FinalDescriptionArrayList更新时

我甚至尝试移动
namedSearch=getIntent().getStringArrayListExtra(“搜索”)也在函数外部

似乎我的doInBackground方法仅在单击列表项时调用,而不是在创建活动时调用。其他所有功能都运行良好。我不确定何时调用我的titlefunc(),为什么FinalDescriptionArrayList不更新

如果您能就此提出任何建议,我将不胜感激。谢谢大家!

我的代码:为了清晰起见,我删除了日志

public class SearchActivity extends AppCompatActivity {

    ListView searchedListView;
    String SearchedWord;
    private ArrayAdapter<String> orgAdapter;
    ArrayList<String> NameDesSearch = new ArrayList<String>();
    ArrayList<String> NameDesTitles = new ArrayList<String>();
    private OService OService;
    ArrayList<ODescription> finalODescriptionArrayList = new ArrayList<ODescription>();

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        searchedListView = (ListView) findViewById(R.id.searched_list_view);
        new GetCourse().execute();

        titlefunc();

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, NameDesTitles);
        searchedListView.setAdapter(arrayAdapter);

        searchedListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedItemText = parent.getItemAtPosition(position).toString();
                ODescription orgDesObj = getLocDesOb(selectedItemText);
                if (orgDesObj != null) {

                    Intent intent = new Intent(SearchActivity.this, View.class);
                    intent.putExtra("sOb", orgDesObj);
                    startActivity(intent);
                }
            }
        });
    }

    @SuppressLint("StaticFieldLeak")
    private class GetCourse extends AsyncTask<Void, Void, Void> {

        @TargetApi(Build.VERSION_CODES.N)
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                finalODescriptionArrayList = JsontoObject.jsonToObjectData(getResources().openRawResource(R.raw.newdb));

            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    public ODescription getLocDesOb(String selectedItemText) {

        if (finalODescriptionArrayList == null) {
            return null;
        }
        for (ODescription locDescObj : finalODescriptionArrayList) {
            if (locDescObj.getName().equals(selectedItemText) || locDescObj.getDescription().equals(selectedItemText)) {
                return locDescObj;
            }
        }
        return null;
    }

    public void titlefunc() {
        NameDesSearch = getIntent().getStringArrayListExtra("searched");
        for (String searchNameDes : NameDesSearch) {
            ODescription orgDesObj2 = getLocDesOb(searchNameDes);
            if (orgDesObj2 != null) {

                NameDesTitles.add(orgDesObj2.getName());
            }
        }
    }
}
公共类SearchActivity扩展了AppCompatActivity{
ListView searchedListView;
字符串搜索词;
专用阵列适配器或适配器;
ArrayList namedSearch=新的ArrayList();
ArrayList name destitles=新的ArrayList();
专用OService-OService;
ArrayList FinalDescriptionArrayList=新建ArrayList();
@RequiresApi(api=Build.VERSION\u code.N)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u search);
searchedListView=(ListView)findViewById(R.id.searched\u list\u view);
新建GetCourse().execute();
titlefunc();
ArrayAdapter ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple_list_item_1,nameditles);
searchedListView.setAdapter(arrayAdapter);
searchedListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串selectedItemText=parent.getItemAtPosition(position.toString();
ODescription orgDesObj=getLocDesOb(selectedItemText);
if(orgDesObj!=null){
意向意向=新意向(SearchActivity.this、View.class);
意图。额外(“sOb”,orgDesObj);
星触觉(意向);
}
}
});
}
@SuppressLint(“StaticFieldLeak”)
私有类GetCourse扩展异步任务{
@TargetApi(Build.VERSION\u code.N)
@凌驾
受保护的空位背景(空位…空位){
试一试{
finalODescriptionArrayList=JsontoObject.jsonToObjectData(getResources().openRawResource(R.raw.newdb));
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}
公共ODescription getLocDesOb(字符串selectedItemText){
if(finalDescriptionArrayList==null){
返回null;
}
对于(ODescription locDescObj:FinalDescriptionArrayList){
if(locDescObj.getName().equals(selectedItemText)| | locDescObj.getDescription().equals(selectedItemText)){
返回locDescObj;
}
}
返回null;
}
公共无效所有权(){
namedSearch=getIntent().getStringArrayListExtra(“已搜索”);
for(字符串搜索namedes:namedsearch){
ODescription orgDesObj2=getLocDesOb(searchNameDes);
如果(orgDesObj2!=null){
NameDesTitles.add(orgDesObj2.getName());
}
}
}
}

在回答下面的问题后进行尝试 使用onPostExecute进行异步任务更新。然后,由于它需要一点时间,一个添加了onPreExecute的进度条。oncreate方法中的titlefunc()已删除

这种方法现在起作用了。但是,有时也存在同样的问题。适配器的Arraylist为空,因此listview为空。看起来还是要花很多时间做后台任务

更新的异步任务

    @SuppressLint("StaticFieldLeak")
    private class GetCourse extends AsyncTask<Void, Void, Void> {
ProgressDialog progressDialog;

@Override
protected void onPreExecute() {
    super.onPreExecute();
    progressDialog = new ProgressDialog(SearchActivity.this);
    progressDialog.setMessage("Searching");
    progressDialog.setCancelable(false);
    progressDialog.show();
}
        @TargetApi(Build.VERSION_CODES.N)
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                finalODescriptionArrayList = JsontoObject.jsonToObjectData(getResources().openRawResource(R.raw.newdb));

            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    titlefunc();
    arrayAdapter.notifyDataSetChanged();
    if (progressDialog.isShowing())
        progressDialog.dismiss();
}
   }
@suppressint(“StaticFieldLeak”)
私有类GetCourse扩展异步任务{
进行对话进行对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(SearchActivity.this);
progressDialog.setMessage(“搜索”);
progressDialog.setCancelable(假);
progressDialog.show();
}
@TargetApi(Build.VERSION\u code.N)
@凌驾
受保护的空位背景(空位…空位){
试一试{
finalODescriptionArrayList=JsontoObject.jsonToObjectData(getResources().openRawResource(R.raw.newdb));
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
titlefunc();
arrayAdapter.notifyDataSetChanged();
if(progressDialog.isShowing())
progressDialog.disclose();
}
}
修改后的标题
Set<String > set = new HashSet<>( NameDesTitles);
NameDesTitles.clear();
NameDesTitles.addAll(set);