java - 在函数之间传递变量
问题描述
我是 android studio 和 Java 的新手。我的应用程序使用 jsoup 将网站的内容传递到一个数组中,其中每个元素都显示在可滑动的抽认卡上(如 tinder)
当我尝试将变量“words”的结果从 onPostExecute()(第 123 行)传递到第 49 行的 String num 时,我的应用程序崩溃了。我想在 onPostExcecute 中获取函数的输出并将其设置为 String num 但我不知道该怎么做。
public class AppHome extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
TextView texx;
private ArrayList<String> al;
private ArrayAdapter<String> arrayAdapter;
private int i;
String words;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_home);
texx= findViewById(R.id.text1);
new doit().execute();
String num = words;
String str[] = num.split(",");
final ArrayList al = new ArrayList<String>(Arrays.asList(str));
arrayAdapter = new ArrayAdapter<>(this, R.layout.item, R.id.helloText, al );
SwipeFlingAdapterView flingContainer = (SwipeFlingAdapterView) findViewById(R.id.frame);
registerForContextMenu(flingContainer);
flingContainer.setAdapter(arrayAdapter);
flingContainer.setFlingListener(new SwipeFlingAdapterView.onFlingListener() {
@Override
public void removeFirstObjectInAdapter() {
// this is the simplest way to delete an object from the Adapter (/AdapterView)
Log.d("LIST", "removed object!");
al.remove(0);
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onLeftCardExit(Object dataObject) {
//Do something on the left!
//You also have access to the original object.
//If you want to use it just cast it (String) dataObject
Toast.makeText(AppHome.this, "left", Toast.LENGTH_SHORT).show();
}
@Override
public void onRightCardExit(Object dataObject) {
Toast.makeText(AppHome.this, "right", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdapterAboutToEmpty(int itemsInAdapter) {
// Ask for more data here
al.add("XML ".concat(String.valueOf(i)));
arrayAdapter.notifyDataSetChanged();
Log.d("LIST", "notified");
i++;
}
@Override
public void onScroll(float scrollProgressPercent) {
}
});
}
public class doit extends AsyncTask<Void,Void,Void> {
//String words;
@Override
protected Void doInBackground(Void... voids) {
try {
Document doc = Jsoup.connect("https://screenscrape4top40.000webhostapp.com/").get();
words=doc.text();
}catch(Exception e){e.printStackTrace();}
return null;
}
@Override
public void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
texx.setText(words);
//String str = (words);
//List<String> elephantList = Arrays.asList(str.split(","));
//texx.setText(elephantList.toString());
// texx.setText(elephantList);
}
}
}
解决方案
public class doit extends AsyncTask<Void, Void, String> {
@Override
protected Void doInBackground(Void... voids) {
String words = "";
try {
Document doc = Jsoup.connect("https://screenscrape4top40.000webhostapp.com/").get();
words = doc.text();
} catch(Exception e) {
e.printStackTrace();
}
return words;
}
@Override
public void onPostExecute(String words) {
super.onPostExecute(aVoid);
texx.setText(words);
//String str = (words);
//List<String> elephantList = Arrays.asList(str.split(","));
//texx.setText(elephantList.toString());
// texx.setText(elephantList);
}
}
现在应该没问题了。
问题是,你没有从doInBackground
方法中返回任何东西,因此你没有在onPostExecute
函数中得到任何东西。
您可以考虑查看AsyncTask
此处的文档。
推荐阅读
- c# - 来自 Bytearray 的 Xamarin 图像 - 防止 Stream 关闭?
- javascript - 如何在没有页面刷新和 URL 路径的情况下使用 ajax 和 php 发送表单数据
- swiper - 使用 Swiper.js,通过项目符号导航有时无法正确滑动
- c - c编程函数不返回false
- mysql - 在给定日期查找事件类型的份额
- sql - 找到单元格中的最大值
- reactjs - 用于堆栈导航器的 React Navigation 5 canGoBack()
- java - java中的for循环查询
- sql - 如何仅返回日期字段上的最新记录,分为两部分
- java - Spring Data 启动异常处理