Java 片段不';启动时不执行异步任务

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

当我的应用程序启动时,它会用片段替换布局,这需要AsyncTask才能正确加载。当我从导航抽屉加载这个片段时,一切正常,但当它在应用程序启动时加载时,AsyncTask不会执行。我怎样才能解决这个问题

主要活动:

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();
    }
}