Java 如何从片段中加载的页面获取JSON数据,并通过asyncbackground调用数据

Java 如何从片段中加载的页面获取JSON数据,并通过asyncbackground调用数据,java,android,json,listview,android-fragments,Java,Android,Json,Listview,Android Fragments,嗨,我正在尝试显示我从Web服务获取的数据。我通过异步后台管理和获取数据。我正试图显示我通过片段加载的视图listview。请看下面的代码 this is my MainActivity.java public class MainActivity extends Activity { private DrawerLayout mDrawerLayout; private ListView mDrawerList; private

嗨,我正在尝试显示我从Web服务获取的数据。我通过异步后台管理和获取数据。我正试图显示我通过片段加载的视图listview。请看下面的代码

this is my MainActivity.java

    public class MainActivity extends Activity
    {
        private DrawerLayout mDrawerLayout;
        private ListView mDrawerList;
        private ActionBarDrawerToggle mDrawerToggle;

        private CharSequence mDrawerTitle;
        private CharSequence mTitle;
        private String[] mActions;

        public JSONArray blogData;
        public String[] blogPostTitle;
        private int position;

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

            mTitle = mDrawerTitle = getTitle();
            mActions = getResources().getStringArray(R.array.action_array);
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerList = (ListView) findViewById(R.id.left_drawer);

            // set a custom shadow that overlays the main content when the drawer opens
            //mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
            // set up the drawer's list view with items and click listener
            mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                    R.layout.drawer_list_item, mActions));
            mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

            // enable ActionBar app icon to behave as action to toggle nav drawer
            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);

            // ActionBarDrawerToggle ties together the the proper interactions
            // between the sliding drawer and the action bar app icon
            mDrawerToggle = new ActionBarDrawerToggle(
                    this,                  /* host Activity */
                    mDrawerLayout,         /* DrawerLayout object */
                    R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
                    R.string.drawer_open,  /* "open drawer" description for accessibility */
                    R.string.drawer_close  /* "close drawer" description for accessibility */
            ) {
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }

                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
            };
            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null) {
                selectItem(0);
            }

        }

        //public void onItemClick(AdapterView<?> adapter, View view,
        //                        int position, long id) {
        //    Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
        //            Toast.LENGTH_SHORT).show();
        //}

        public void signInClick(View v) {
            //Button button = (Button) v;
            //startActivity(new Intent(getApplicationContext(), PatientActivity.class));
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.main, menu);
            return super.onCreateOptionsMenu(menu);
        }

        /* Called whenever we call invalidateOptionsMenu() */
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            // If the nav drawer is open, hide action items related to the content view
            //boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            return super.onPrepareOptionsMenu(menu);
        }


        /* */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // The action bar home/up action should open or close the drawer.
            // ActionBarDrawerToggle will take care of this.
            if (mDrawerToggle.onOptionsItemSelected(item)) {
                return true;
            }
                    return super.onOptionsItemSelected(item);
        }


        /* The click listener for ListView in the navigation drawer */
        private class DrawerItemClickListener implements ListView.OnItemClickListener {
            int pos;

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);

            }
        }

        private void selectItem(int position) {
            // update the main content by replacing fragments
            Fragment fragment = new ActionFragment();
            Bundle args = new Bundle();
            args.putInt(ActionFragment.ARG_ACTION1_NUMBER, position);
            fragment.setArguments(args);

            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            setTitle(mActions[position]);
            mDrawerLayout.closeDrawer(mDrawerList);

        }

        @Override
        public void setTitle(CharSequence title) {
            mTitle = title;
            getActionBar().setTitle(mTitle);
        }

        /**
         * When using the ActionBarDrawerToggle, you must call it during
         * onPostCreate() and onConfigurationChanged()...
         */

        @Override
        protected void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
            // Sync the toggle state after onRestoreInstanceState has occurred.
            mDrawerToggle.syncState();
        }

        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            // Pass any configuration change to the drawer toggles
            mDrawerToggle.onConfigurationChanged(newConfig);
        }
    }
这是我的MainActivity.java
公共类MainActivity扩展了活动
{
私人抽屉布局mDrawerLayout;
私有列表视图mDrawerList;
私有操作bardrawertoggle mDrawerToggle;
私有字符序列mDrawerTitle;
私有字符序列mTitle;
私有字符串[]符号;
公共JSONArray博客数据;
公共字符串[]blogPostTitle;
私人职位;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
列表视图列表视图;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTitle=mDrawerTitle=getTitle();
mActions=getResources().getStringArray(R.array.action\u数组);
mDrawerLayout=(抽屉布局)findViewById(R.id.抽屉布局);
mDrawerList=(ListView)findViewById(R.id.left\u抽屉);
//设置抽屉打开时覆盖主要内容的自定义阴影
//mDrawerLayout.setDrawerShadow(R.drawable.drawer\u shadow,GravityCompat.START);
//使用项目设置抽屉的列表视图,然后单击listener
mDrawerList.setAdapter(新阵列适配器,
R.布局图、抽屉清单(项目、标记);
setOnItemClickListener(新的DrawerItemClickListener());
//启用ActionBar应用程序图标作为切换导航抽屉的操作
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
//ActionBarDrawerToggle将适当的交互连接在一起
//在滑动抽屉和操作栏应用程序图标之间
mDrawerToggle=新操作bardrawertoggle(
此,/*主机活动*/
mDrawerLayout,/*抽屉布局对象*/
R.drawable.ic_抽屉,/*导航抽屉图像替换“Up”插入符号*/
R.string.drawer\u open,/*“open drawer”描述,用于辅助功能*/
R.string.drawer\u close/*“close drawer”可访问性说明*/
) {
公共无效onDrawerClosed(视图){
getActionBar().setTitle(mTitle);
InvalidateOptions SMenu();//创建对OnPrepareOptions SMenu()的调用
}
打开图纸上的公共空白(视图抽屉视图){
getActionBar().setTitle(mDrawerTitle);
InvalidateOptions SMenu();//创建对OnPrepareOptions SMenu()的调用
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
如果(savedInstanceState==null){
选择项目(0);
}
}
//public void onItemClick(适配器视图适配器、视图、,
//内部位置,长id){
//Toast.makeText(getApplicationContext(),((TextView)视图).getText(),
//吐司。长度(短)。show();
//}
公共无效标志单击(视图五){
//按钮=(按钮)v;
//startActivity(新意图(getApplicationContext(),PatientActivity.class));
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。主菜单,菜单);
返回super.onCreateOptions菜单(菜单);
}
/*调用InvalidateOptions菜单()时调用*/
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//如果导航抽屉打开,则隐藏与内容视图相关的操作项
//boolean-DrawerLayout=mDrawerLayout.isDrawerOpen(mDrawerList);
返回super.onPrepareOptions菜单(菜单);
}
/* */
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//操作栏home/up操作应打开或关闭抽屉。
//ActionBarDrawerToggle会处理好的。
如果(MDRAWERTOGLE.onOptionsItemSelected(项目)){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/*在导航抽屉中单击ListView的侦听器*/
私有类DrawerItemClickListener实现ListView.OnItemClickListener{
int pos;
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
选择项目(位置);
}
}
私有void selectItem(内部位置){
//通过替换片段更新主要内容
Fragment Fragment=新的ActionFragment();
Bundle args=新Bundle();
args.putInt(ActionFragment.ARG_ACTION1_编号、位置);
fragment.setArguments(args);
FragmentManager FragmentManager=getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment.commit();
//更新所选项目和标题,然后关闭抽屉
mDrawerList.setItemChecked(位置,true);
设置标题(位置);
mDrawerLayout.closeDrawer(mDrawerList);
}
@凌驾
公共无效设置标题(字符序列标题){
mTitle=标题;
getActionBar().setTitle(mTitle);
}
/**
*使用ActionBarDrawerToggle时,必须在
*onPostCreate()和onConfigurationChanged()。。。
*/
@凌驾
后创建时受保护的无效(Bun
public class ActionFragment extends Fragment
{
    public static final String ARG_ACTION1_NUMBER = "Fragment_layout";

    public JSONArray blogData;
    public String[] blogPostTitle;

    public ActionFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_layout, container, false);
        int i = getArguments().getInt(ARG_ACTION1_NUMBER);

        if (i == 0)
        {
            rootView = inflater.inflate(R.layout.fragment_layout, container, false);
        }
        else if (i == 1) {
            rootView = inflater.inflate(R.layout.fragment_articles, container, false);
            ListView listview1 = (ListView) rootView.findViewById(R.id.article_list);

            ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(getActivity(), R.layout.layout_listitem, R.id.titleTV, blogPostTitle);
            listview1.setAdapter(arrayAdapter1);

        } else if (i == 2)
        {
            rootView = inflater.inflate(R.layout.fragment_news, container, false);
        } else if (i == 3) {
            rootView = inflater.inflate(R.layout.fragment_signin, container, false);
        }
        return rootView;
    }

    public void articleList()
    {
        if (blogData == null)
        {
            // TODO: update list when null.
        }
        else
        {
            try
            {
                blogPostTitle = new String[blogData.length()];
                for (int i = 0; i < blogData.length(); i++)
                {
                    JSONObject jsonObject = blogData.getJSONObject(i);
                    String title = jsonObject.getString("title");
                    title = Html.fromHtml(title).toString();
                    blogPostTitle[i] = title;
                }


            } catch (JSONException e) {
                Log.e("TAG", "Exception Caught: ", e);
            }
        }
    }

    private final MyListener mListener = new MyListener()
    {

        @Override
        public void onComplete(JSONArray result) {

            PostController postActivity = new PostController(mListener);
            postActivity.execute();
            blogData = result;
            articleList();
        }
    };

}
public class PostController extends AsyncTask<Object, Void, JSONArray> {

    MyListener mListener;

    public PostController(MyListener listenr) {
        mListener = listenr;
    }

    @Override
    protected JSONArray doInBackground(Object... arg0)
    {

        String result = "No data available";
        JSONArray jsonResponse = null;

        try
        {
            DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
            //TODO: URL ADDRESS for Articles.
            HttpGet httpGet = new HttpGet("http://localhost/public/webservices/post");
            httpGet.setHeader("Content-type", "application/json");

            InputStream inputStream = null;

            HttpResponse response = httpclient.execute(httpGet);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // json is UTF-8 by default
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line);
            }
            result = sb.toString();
            jsonResponse = new JSONArray(result);

            // TODO: Remove log.
            Log.d("TAG", String.valueOf(jsonResponse));
        }
        catch (MalformedURLException e)
        {
            Log.e("TAG", "exception caught: ", e);
        }
        catch (IOException e)
        {
            Log.e("TAG", "exception caught: ", e);
        }
        catch (Exception e)
        {
            Log.e("TAG", "exception caught: ", e);
        }
        return jsonResponse;
    }

    @Override
    protected void onPostExecute(JSONArray result)
    {
        mListener.onComplete(result);

    }
}
05-08 08:07:27.189    2585-2585/medapp.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: medapp.app, PID: 2585
java.lang.NullPointerException: storage == null
        at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
        at java.util.Arrays.asList(Arrays.java:155)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:141)
        at medapp.app.ActionFragment.onCreateView(ActionFragment.java:42)
        at android.app.Fragment.performCreateView(Fragment.java:1700)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
        at android.app.BackStackRecord.run(BackStackRecord.java:684)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
        at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
`public class HomeFragment extends Fragment {

    protected ProgressBar mProgressBar;
    protected JSONArray blogPostData;
    protected String[] blogPostTitle;

    ListView listView;

    View rootView;

    public HomeFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
rootView.findViewById(R.id.article_list);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.layout_listview_article,R.id.titleTV,blogPostTitle);
        listView.setAdapter(adapter);*/

        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        listView = (ListView) rootView.findViewById(R.id.article_list);

        ArticleController articleController = new ArticleController(mListener);
        articleController.execute();
        return rootView;
    }

    MyListener mListener = new MyListener(){

        @Override
        public void onComplete(JSONArray result) {

            // TODO: Here you will get the Jsonarray from Asynctask.
            // Process it and get the values.
            blogPostData = result;
            updateArticleList();
            ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(getActivity(), R.layout.layout_listview_article, R.id.titleTV, blogPostTitle);
            listView.setAdapter(arrayAdapter1);
        }
    };

    protected void updateArticleList(){

        try {

            blogPostTitle = new String[blogPostData.length()];
            String[] blogPostDate = new String[blogPostData.length()];
            String[] blogPostAuthor = new String[blogPostData.length()];
            for (int i = 0; i < blogPostData.length(); i++)
            {
                JSONObject jsonObject = blogPostData.getJSONObject(i);
                String title = jsonObject.getString("title");
                title = Html.fromHtml(title).toString();
                blogPostTitle[i] = title;

                String date = jsonObject.getString("date");
                title = Html.fromHtml(title).toString();
                blogPostTitle[i] = title;

                String author = jsonObject.getString("author");
                title = Html.fromHtml(title).toString();
                blogPostTitle[i] = title;

                Log.d("TAG", "Title: " + blogPostTitle);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}`
public class PostActivity extends AsyncTask<Object, Void, JSONArray> {

MyListener mListener;

public PostActivity(MyListener listenr) {
    mListener = listenr;
}

@Override
protected JSONArray doInBackground(Object... arg0)
{
  // your code
  jsonResponse = new JSONArray(result);
  return jsonResponse;
}

@Override
protected void onPostExecute(JSONArray result){

 mListener.your_callback(result); // send the result back to the fragment,
} 

}
public interface MyListener {    
   public abstract void onComplete(JSONArray result);
}
private final MyListener mListener = new MyListener(){

    @Override
    public void onComplete(JSONArray result) {

    // TODO: Here you will get the Jsonarray from Asynctask. 
    // Process it and get the values.
    blogData = result;
    articleList();
    }
 }
PostActivity postActivity = new PostActivity(mListener);
postActivity.execute();
    else if (i == 1) {
            rootView = inflater.inflate(R.layout.fragment_articles, container, false);
            listview1 = (ListView) rootView.findViewById(R.id.article_list);

            PostController postActivity = new PostController(mListener);
            postActivity.execute();               

        } 
   private final MyListener mListener = new MyListener()
   {

    @Override
    public void onComplete(JSONArray result) {

        blogData = result;
        articleList();

        ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(getActivity(),   R.layout.layout_listitem, R.id.titleTV, blogPostTitle);
            listview1.setAdapter(arrayAdapter1);
    }
};