本人新手,想做一个类微博,几个fragment可以切换的页面。
但是MainActivity中,通过Fragment[]获取其中一个ListFragment的时候,总是获取为空,在ListFragment中断点时发现onPostExecute这方法死活不执行,前面的doInBackground都已经可以获取服务器的数据,并成功转换。
已经百度,google了很多方法,还是没解决,求大神指点。
贴一下代码:
MainActivity类:其中mFragments[1] 老获取为空
public class MainActivity extends FragmentActivity {
private Fragment[] mFragments;
private ListFragment listFragment;
private RadioGroup bottomRg;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private RadioButton rbOne, rbTwo, rbThree, rbFour;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mFragments = new Fragment[3];
fragmentManager = getSupportFragmentManager();
mFragments[0] = fragmentManager.findFragmentById(R.id.fragement_main);
mFragments[1] = fragmentManager.findFragmentById(R.id.fragement_search);
mFragments[2] = fragmentManager.findFragmentById(R.id.fragement_setting);
fragmentTransaction = fragmentManager.beginTransaction().hide(mFragments[0]).hide(mFragments[1]).hide(mFragments[2]);
fragmentTransaction.show(mFragments[0]).commit();
setFragmentIndicator();
}
ListFragment类:这里onPostExecute就一直不执行
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
View v = inflater.inflate(R.layout.list_res_tab, container, false);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.d(TAG, "OnCreate");
super.onActivityCreated(savedInstanceState);
new ListResAsyncTask().execute(url);
try {
Class.forName("android.os.AsyncTask");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Log.d(TAG, "OnCreate1");
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
System.out.println("Click On List Item!!!");
super.onListItemClick(l, v, position, id);
}
@Override
public void onPause() {
super.onPause();
}
public class ListResAsyncTask extends AsyncTask<String, Void, List<Map<String,Object>>>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected List<Map<String,Object>> doInBackground(String... params)
{
String citiesString = HttpUtils.sendPostMessage(params[0], "utf-8");
// 解析服务器端的json数据
listItems = JsonUtils.parseRestaurant(citiesString);
try {
Class.forName("android.os.AsyncTask");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return listItems;
}
@SuppressLint("ShowToast")
@Override
protected void onPostExecute(List<Map<String,Object>> result)
{
// TODO Auto-generated method stub
super.onPostExecute(result);
if(result == null){
Log.d(TAG, "获取信息失败!");
Toast.makeText(getActivity(), "获取信息失败!", 3000);
}else{
final String[] from = new String[]{"photograph","title","region","restaurant","price","summary","time"};
final int[] to = new int[]{R.id.photograph,R.id.title,R.id.region,R.id.restaurant,R.id.price,R.id.summary,R.id.time};
//创建适配器
SimpleAdapter adapter = new SimpleAdapter(getActivity(),result,R.layout.list_res_item,from,to);
setListAdapter(adapter);
Log.d(TAG, "onPostExecute");
}
}
}
报错:
12-04 17:34:50.093: E/AndroidRuntime(28260): FATAL EXCEPTION: main
12-04 17:34:50.093: E/AndroidRuntime(28260): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fatground.test/com.fatground.test.MainActivity}: java.lang.NullPointerException
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2068)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2093)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread.access$600(ActivityThread.java:134)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.os.Looper.loop(Looper.java:137)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread.main(ActivityThread.java:4814)
12-04 17:34:50.093: E/AndroidRuntime(28260): at java.lang.reflect.Method.invokeNative(Native Method)
12-04 17:34:50.093: E/AndroidRuntime(28260): at java.lang.reflect.Method.invoke(Method.java:511)
12-04 17:34:50.093: E/AndroidRuntime(28260): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
12-04 17:34:50.093: E/AndroidRuntime(28260): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
12-04 17:34:50.093: E/AndroidRuntime(28260): at dalvik.system.NativeStart.main(Native Method)
12-04 17:34:50.093: E/AndroidRuntime(28260): Caused by: java.lang.NullPointerException
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:656)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.Activity.performStart(Activity.java:5018)
12-04 17:34:50.093: E/AndroidRuntime(28260): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
12-04 17:34:50.093: E/AndroidRuntime(28260): ... 11 more
------解决思路----------------------
把这句话 删掉 试试看:super.onPostExecute(result);
------解决思路----------------------
NullPointerException 各种打印 看 这个空指针是哪个
------解决思路----------------------
在线程doinbackground之后,在onPostExecute中处理 这个时候已经回到主线程了。
这样看也看不出是什么问题,只有调试才能看出问题了
------解决思路----------------------
拜托,你都找到哪个是空指针了,就对症下药啊,看是不是传参的问题,或者是初始化的问题,构造中的问题?多打几个Log出来,慢慢调。