Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask完成后更新片段视图将返回nullPointerException_Android_Android Asynctask_Fragment - Fatal编程技术网

Android AsyncTask完成后更新片段视图将返回nullPointerException

Android AsyncTask完成后更新片段视图将返回nullPointerException,android,android-asynctask,fragment,Android,Android Asynctask,Fragment,我正在开发一个应用程序,它使用3个片段(实际页面)。一个片段用作侦听器,另外两个片段的数据正在下载,然后设置为TextView。一切都很正常,直到我认为如果片段视图在异步完成后立即更新/刷新会很酷。问题是每次我试图更新片段时,它都会抛出null指针异常 顺便说一句,我想我可能对这种类型的片段管理采取了错误的方法,但它实际上是有效的,我只想要一个很酷的小功能,我想也许我不需要重写我的整个程序 这就是我的mainActivity.java 公共类MainActivity扩展了FragmentActi

我正在开发一个应用程序,它使用3个片段(实际页面)。一个片段用作侦听器,另外两个片段的数据正在下载,然后设置为TextView。一切都很正常,直到我认为如果片段视图在异步完成后立即更新/刷新会很酷。问题是每次我试图更新片段时,它都会抛出null指针异常

顺便说一句,我想我可能对这种类型的片段管理采取了错误的方法,但它实际上是有效的,我只想要一个很酷的小功能,我想也许我不需要重写我的整个程序

这就是我的mainActivity.java

公共类MainActivity扩展了FragmentActivity{

//some uninportant initalizations



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(3);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1);
    Autogidas agidas = new Autogidas();


}

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new Pagrindinis();

        switch (position) {
        case 0:         
            return fragment = new Autogidas();
        case 1:
            return fragment = new Pagrindinis();
        case 2:
            return fragment = new AutoPlius();
        default:
            break;
        }
        return fragment;
    }


    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }




    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_section1).toUpperCase(l);
        case 1:
            return getString(R.string.title_section2).toUpperCase(l);
        case 2:
            return getString(R.string.title_section3).toUpperCase(l);
        }
        return null;
    }

}
}

公共类Autogidas扩展了片段{

TextView dummyTextViewA;
MainActivity mActivity;
String textToSet;
Context cont;
StringBuffer c;
MySQLiteHelper db;
SharedPreferences prefs;
View rootView;
ArrayList<Car> cars;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

public void setDb(Context con) {
    db = new MySQLiteHelper(con);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.autogidas, container, false);
    dummyTextViewA = (TextView) rootView.findViewById(R.id.section_label);
    cont = getActivity();
    setDb(cont.getApplicationContext());
    dummyTextViewA.setText("");
    setTextView();//function to return new data from database
    mActivity = new MainActivity();
    Log.i("onCreateView", "onCreateView");
    return rootView;

}

@Override
public void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
    Log.v("saveInstaceState", "In frag's on save instance state ");

    outState.putString("textView", dummyTextViewA.toString());

}

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewStateRestored(savedInstanceState);

    Log.v("restored", "Inside of onRestoreInstanceState");
    if (savedInstanceState != null) {
        dummyTextViewA.setText(savedInstanceState.getString("textView"));
        ;
    }
}

public Context conts(Context con) {
    return cont = con;
}


public void sendNotif(Context con, String data) {
    CheckNetwork.sendNotification(con, data);
}

public void download() {
    //function to start asynctask

}

private class DownloadFilesTask extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

    }

    private boolean checkIfPromoted() {
        //asynctaskstuff
    }

    @Override
    protected String doInBackground(Void... params) {

        //even more asynctask stuff

        }
        return textToSet;
    }

    @Override
    protected void onPostExecute(String result) {


        Autogidas agidas = new Autogidas();
        agidas.getFragmentManager().beginTransaction().detach(agidas).commit();
        agidas.getFragmentManager().beginTransaction().attach(agidas).commit();

        super.onPostExecute(result);

    }

}
++日志:

04-22 19:49:24.810: W/dalvikvm(26354): threadid=1: thread exiting with uncaught exception (group=0x40a8ca20)
04-22 19:49:24.830: E/AndroidRuntime(26354): FATAL EXCEPTION: main
04-22 19:49:24.830: E/AndroidRuntime(26354): java.lang.NullPointerException
04-22 19:49:24.830: E/AndroidRuntime(26354):    at com.example.carseeker.Autogidas$DownloadFilesTask.onPostExecute(Autogidas.java:303)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at com.example.carseeker.Autogidas$DownloadFilesTask.onPostExecute(Autogidas.java:1)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.os.AsyncTask.finish(AsyncTask.java:602)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.os.AsyncTask.access$600(AsyncTask.java:156)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.os.Looper.loop(Looper.java:137)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at android.app.ActivityThread.main(ActivityThread.java:4424)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at java.lang.reflect.Method.invokeNative(Native Method)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at java.lang.reflect.Method.invoke(Method.java:511)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
04-22 19:49:24.830: E/AndroidRuntime(26354):    at dalvik.system.NativeStart.main(Native Method)
在过去的5个小时里,我一直在处理这个问题,但我不知道该如何处理它

因此,也许您可以帮助我说明应该放置在何处以及放置哪些方法。我认为最好的方法是使用fragment attach/detach,但使用它只需发送nullpointer异常。如果您能帮助我,我将非常感激。

在您的onPostExecute()中:

我认为您正在尝试分离以前的片段(在gidasListener中创建),名称也为
agidas
,并分离新片段(当前
agidas
)。是这样吗?如果是这样,我想您可以使用

getFragmentManager().detach(Autogidas.this).commit()

要获取对当前片段(您正在尝试分离的片段)的引用,尽管我不知道将当前片段从自身分离会做什么。

好的,我已经解决了所有问题

如果有人正在处理动态片段事务,不要忘记在活动中以编程方式添加片段,就像这样

FragmentTransaction ftransc=getSupportFragmentManager().beginTransaction();
        Autogidas myautogidas=new Autogidas();
        Pagrindinis pagr = new Pagrindinis();
        ftransc.add(viewPager.getId(), myautogidas, "FirstFragment");
ftransc.commit()

我不知道到底为什么,因为我的整个应用程序运行得很好,但你只需要这样做

即使添加了片段,您也可能希望在任务完成时更新片段中的数据。这很容易做到

我找到了一个简单的方法,并将其放在我的片段中:

public void refreshData(ArrayList<Car> data) {
        viewPager = MainActivity.getAppPager();
        Log.d("start", "refresh");
        TabsPagerAdapter sk = new TabsPagerAdapter(getFragmentManager());
        viewPager.setAdapter(sk);
        cars = new ArrayList<Car>(data);
        StringBuffer c = new StringBuffer();
        for (Car car : cars) {

            c.append(car + "\n");
        }
        tv.setText(c.toString());
        viewPager.getAdapter().notifyDataSetChanged();

    }
即使在调用notifydatasetchanged()之后;也不会做任何事情

1.您必须从活动中心获取您的viewPager:

public static ViewPager getAppPager() {
        return viewPager;
    }
然后检查我的refreshData()方法

我想我不必传递整个arrayList,因为我从数据库中获得了正确的结果,onpostexecute只是用作更新片段的触发器


就这样!:)

在哪里执行DownloadFilesTask?为什么不在onPostExecute中设置文本?我正在从另一个片段执行DownloadFilesTask。(添加到post)任何改变我的片段从异步布局的行为都会导致NullPointerException,你在哪里收到NullPointerException?LogCat会说什么?抱歉,没有提供足够的信息。我更新了帖子,尝试在onpostexecute和LogCat日志中刷新我的片段。请参阅我的答案以了解可能的解决方案不管我在做什么,如果我试图用片段做任何事情,它都会导致应用程序崩溃。顺便说一句,我正在使用detach/attach刷新片段。在调试器中,它到底在哪里崩溃-请参见Autogidas.java:303Lol行,我没有在我的主活动中以编程方式添加片段,这导致了nullptr,除了ion.detach/attach现在可以工作了,每当ASyncTask完成时调用CreateView,唯一的问题是片段视图不会更新,但我认为它很容易解决。
public void refreshData(ArrayList<Car> data) {
        viewPager = MainActivity.getAppPager();
        Log.d("start", "refresh");
        TabsPagerAdapter sk = new TabsPagerAdapter(getFragmentManager());
        viewPager.setAdapter(sk);
        cars = new ArrayList<Car>(data);
        StringBuffer c = new StringBuffer();
        for (Car car : cars) {

            c.append(car + "\n");
        }
        tv.setText(c.toString());
        viewPager.getAdapter().notifyDataSetChanged();

    }
MySQLiteHelper db = new MySQLiteHelper(MainActivity.getAppContext());
            ArrayList<Car> refreshedArray = db.newCars("agidas");
            Autogidas gidas = (Autogidas) getFragmentManager()
                    .findFragmentByTag("FirstFragment");
            if (gidas != null) {
                gidas.refreshData(refreshedArray);
                Log.d("Fragment", "found");
            }
@Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
public static ViewPager getAppPager() {
        return viewPager;
    }