我无法在主活动中分配由 AysncTask 的 OnPostExecute 方法返回的 ArrayList



我正在尝试从onPostExecute主活动中AsyncTask的方法返回ArrayList。我正在将返回的数组列表分配给主要活动的搜索文本数组列表。我无法在btnSearchonClickListener中获取搜索文本数组列表的元素。请让我知道代码中出了什么问题。

package com.example.dharak029.hw3_group09;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.InputStream;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText textIn;
ImageButton buttonAdd;
LinearLayout container;
ArrayList<String> wordList;
byte[] buffer;
String text;
ArrayList<String> searchText;
ArrayList<String> searchedText;
int keywordCount=0;
void setResult(ArrayList<String> searchedText){
this.searchedText = searchedText;
Log.d("result",""+searchedText.size());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textIn = (EditText)findViewById(R.id.textin);
buttonAdd = (ImageButton)findViewById(R.id.add);
container = (LinearLayout)findViewById(R.id.container);
wordList = new ArrayList<String>();
searchText = new ArrayList<String>();

try {
InputStream is = getAssets().open("textfile.txt");
int size = is.available();
buffer = new byte[size];
is.read(buffer);
is.close();
text = new String(buffer);
int startIndex = 0;
for(int i=0;i<text.length()/30;i++){
searchText.add(text.substring(startIndex,startIndex+30));
startIndex = startIndex+30;
}

}
catch (Exception e){
}


findViewById(R.id.btnSearch).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(String word: wordList){
new DoWork(MainActivity.this).execute(word);
}
Intent intent = new Intent(MainActivity.this,WordsFound.class);
intent.putExtra("searchResults",searchedText);
startActivity(intent);
}
});
buttonAdd.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if (keywordCount <= 20) {
LayoutInflater layoutInflater =
(LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View addView = layoutInflater.inflate(R.layout.row, null);
final TextView textOut = (TextView) addView.findViewById(R.id.textout);
textOut.setText(textIn.getText().toString());
wordList.add(textIn.getText().toString());
ImageButton buttonRemove = (ImageButton) addView.findViewById(R.id.remove);
final View.OnClickListener thisListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
((LinearLayout) addView.getParent()).removeView(addView);
wordList.remove(textOut.getText().toString());
listAllAddView();
keywordCount--;
}
};
buttonRemove.setOnClickListener(thisListener);
container.addView(addView);
listAllAddView();
keywordCount++;
}
}
});
}
private void listAllAddView(){
int childCount = container.getChildCount();
for(int i=0; i<childCount; i++){
View thisChild = container.getChildAt(i);
}
}

class DoWork extends AsyncTask<String,Integer,ArrayList<String>>{
ArrayList<String> searchResult = new ArrayList<String>();
ProgressBar progress;
MainActivity activity;
public DoWork(MainActivity activity) {
this.activity = activity;
}
@Override
protected ArrayList<String> doInBackground(String... params) {
for(int i=0;i<searchText.size();i++){
String text = searchText.get(i);
if(text.contains(params[0]))
searchResult.add(text);
}
Log.d("demo",""+searchResult.size());
return searchResult;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(ArrayList<String> aVoid) {
super.onPostExecute(aVoid);
activity.setResult(aVoid);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}
}

你不能把ArrayList放在额外的putExtra()你必须使用putStringArrayListExtra()。尝试下面的代码。

Intent intent = new Intent(MainActivity.this,WordsFound.class);
intent.putStringArrayListExtra("searchResults",searchedText);
startActivity(intent);

问题出在以下代码中:

findViewById(R.id.btnSearch).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(String word: wordList){
new DoWork(MainActivity.this).execute(word);
}
Intent intent = new Intent(MainActivity.this, WordsFound.class);
intent.putExtra("searchResults",searchedText);
startActivity(intent);
}
});

让我们剖析代码。以下代码没有问题。这是点击侦听器的常用代码:

findViewById(R.id.btnSearch).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ... }

现在,我们从以下代码中查看正文代码:

for(String word: wordList){
new DoWork(MainActivity.this).execute(word);
}

我们知道DoWork是一个AsyncTask,它正在执行一个异步过程。因此,即使DoWork尚未完成其过程,也将执行下一个代码

让我们看看下一个代码:

Intent intent = new Intent(MainActivity.this, WordsFound.class);
intent.putExtra("searchResults", searchedText);
startActivity(intent);

在这里,您将额外的变量放在searchedText变量中,该变量仅在onCreate中初始化:

searchText = new ArrayList<String>();

因此,在设置额外内容时,您将始终拥有空列表。

要克服空列表问题,您需要仅在DoWork完成其工作后发送额外的内容。您可以尝试在setResult中调用 Intent

最新更新