Java 片段不';启动时不执行异步任务
当我的应用程序启动时,它会用片段替换布局,这需要AsyncTask才能正确加载。当我从导航抽屉加载这个片段时,一切正常,但当它在应用程序启动时加载时,AsyncTask不会执行。我怎样才能解决这个问题 主要活动:Java 片段不';启动时不执行异步任务,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,当我的应用程序启动时,它会用片段替换布局,这需要AsyncTask才能正确加载。当我从导航抽屉加载这个片段时,一切正常,但当它在应用程序启动时加载时,AsyncTask不会执行。我怎样才能解决这个问题 主要活动: public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @Override protected void
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Fragment fragment = null;
Class fragmentClass = null;
fragmentClass = NewsFragment.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frameLayoutForFragments, fragment);
fragmentTransaction.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.getMenu().getItem(0).setChecked(true);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
//Wybory elementów w navigationdrawer
Fragment fragment = null;
Class fragmentClass = null;
int id = item.getItemId();
if (id == R.id.nav_news) {
fragmentClass = NewsFragment.class;
} else if (id == R.id.nav_map) {
fragmentClass = MapFragment.class;
} else if (id == R.id.nav_buildings) {
fragmentClass = BuildingsFragment.class;
} else if (id == R.id.nav_manage) {
fragmentClass = MapFragment.class;
} else if (id == R.id.nav_info) {
fragmentClass = AppInfoFragment.class;
} else if (id == R.id.nav_bugreport) {
fragmentClass = ContactFragment.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frameLayoutForFragments, fragment).commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
启动时加载的片段:
public class NewsFragment extends Fragment {
public static ArrayList <ParsedWebData> list = new ArrayList<ParsedWebData>();
public NewsFragment() {
// Required empty public constructor
}
public static NewsFragment newInstance(Context context) {
NewsFragment fragment = new NewsFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Start AsyncTask w momencie ładowania fragmentu
AsyncXMLParser parser = new AsyncXMLParser();
parser.execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_news, container, false);
ListView listView = (ListView) view.findViewById(R.id.listViewNews);
CustomListViewAdapter customListViewAdapter = new CustomListViewAdapter(getContext(), R.id.listViewNews, list);
listView.setAdapter(customListViewAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
ParsedWebData singleData = list.get(position);
String url = singleData.getUrl();
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
}
});
return view;
}
}
公共类新闻片段扩展片段{
public static ArrayList list=new ArrayList();
公共新闻片段(){
//必需的空公共构造函数
}
公共静态新闻片段newInstance(上下文){
NewsFragment=新的NewsFragment();
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//启动异步任务w Momentcieładowania fragmentu
AsyncXMLParser=新的AsyncXMLParser();
parser.execute();
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u news,container,false);
ListView=(ListView)view.findViewById(R.id.listViewNews);
CustomListViewAdapter CustomListViewAdapter=新的CustomListViewAdapter(getContext(),R.id.listViewNews,list);
setAdapter(customListViewAdapter);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(适配器视图a、视图v、内部位置、长id){
ParsedWebData singleData=list.get(位置);
字符串url=singleData.getUrl();
Intent-browserint=新的Intent(Intent.ACTION_视图,Uri.parse(url));
startActivity(浏览器内容);
}
});
返回视图;
}
}
异步任务:
public class AsyncXMLParser extends AsyncTask <Void, Integer, ArrayList<ParsedWebData>> {
@Override
protected void onPreExecute() {
}
@Override
protected ArrayList<ParsedWebData> doInBackground(Void... params) {
ArrayList<ParsedWebData> list = new ArrayList<ParsedWebData>();
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
// We will get the XML from an input stream
InputStream input = new URL("linkhere").openStream();
xpp.setInput(input, "UTF_8");
int eventType = xpp.getEventType();
String text = null;
ParsedWebData data = new ParsedWebData();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = xpp.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if (tagname.equalsIgnoreCase("item")) {
data = new ParsedWebData();
}
break;
case XmlPullParser.TEXT:
text = xpp.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("item")) {
// add employee object to list
list.add(data);
} else if (tagname.equalsIgnoreCase("title")) {
data.title = text;
} else if (tagname.equalsIgnoreCase("link")) {
data.url = text;
} else if (tagname.equalsIgnoreCase("description")) {
text = Jsoup.parse(text).text();
data.description = text;
}
break;
default:
break;
}
eventType = xpp.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
NewsFragment.list = list;
return list;
}
@Override
protected void onPostExecute(ArrayList <ParsedWebData> result) {
}
}
公共类AsyncXMLParser扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
ArrayList=新建ArrayList();
试一试{
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp=factory.newPullParser();
//我们将从输入流中获取XML
InputStream输入=新URL(“链接此处”).openStream();
xpp.setInput(输入,“UTF_8”);
int eventType=xpp.getEventType();
字符串文本=空;
ParsedWebData数据=新的ParsedWebData();
while(eventType!=XmlPullParser.END_文档){
字符串标记名=xpp.getName();
开关(事件类型){
case XmlPullParser.START_标记:
if(标记名.equalsIgnoreCase(“项”)){
数据=新的ParsedWebData();
}
打破
case XmlPullParser.TEXT:
text=xpp.getText();
打破
case XmlPullParser.END_标记:
if(标记名.equalsIgnoreCase(“项”)){
//将雇员对象添加到列表
列表。添加(数据);
}else if(标记名.equalsIgnoreCase(“标题”)){
data.title=文本;
}else if(标记名.equalsIgnoreCase(“链接”)){
data.url=文本;
}else if(标记名.equalsIgnoreCase(“说明”)){
text=Jsoup.parse(text.text();
data.description=文本;
}
打破
违约:
打破
}
eventType=xpp.next();
}
}catch(XMLPullParseRexE){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
NewsFragment.list=列表;
退货清单;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
}
}
我试图自己找到原因,并试图在MainActivity中手动执行AsyncTask,但没有帮助。有什么问题吗?我找不到为什么不执行Asynctask的原因,但根据您想做多少后台工作,您可能不想使用 异步任务。Asynctask应仅用于执行花费少量时间(最多几秒钟)的操作,因为它的生存期与ui组件的生存期相关联。这里的问题很可能是您正在终止asynctask,因为它连接到ui
我建议您使用intentservice。它们非常易于使用,可以在后台运行任意时间。因为在这种情况下,您似乎找不到Asynctask的问题,所以使用IntentService可能会节省时间 我找不到为什么不执行Asynctask的原因,但根据您想做多少后台工作,您可能不想使用 异步任务。Asynctask应仅用于执行花费少量时间(最多几秒钟)的操作,因为它的生存期与ui组件的生存期相关联。这里的问题很可能是您正在终止asynctask,因为它连接到ui
我建议您使用intentservice。它们非常易于使用,可以在后台运行任意时间。因为在这种情况下,您似乎找不到Asynctask的问题,所以使用IntentService可能会节省时间 问题是,AsyncTask(线程)在OnCreateView运行后完成,因此您看不到数据。
您可以做的是移动代码行
NewsFragment.list=list代码>从doInBackground()
,到onPostExecute()
,然后调用ad
public class AsyncXMLParser extends AsyncTask <Void, Integer, ArrayList<ParsedWebData>> {
CustomListViewAdapter _adapter;
Public AsyncXMLParser(CustomListViewAdapter adapter) {
_adapter = adapter;
}
...
@Override
protected void onPostExecute(ArrayList <ParsedWebData> result) {
CustomListViewAdapter customListViewAdapter = new CustomListViewAdapter(getContext(), R.id.listViewNews, result);
listView.setAdapter(customListViewAdapter);
// Or, depending on design
_adapter.notifyDataSetChanged();
}
}