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