簡體   English   中英

從服務器加載數據時,片段中的空指針異常

[英]Null pointer exception in Fragment when loading data from server

我是Android新手。 我正在開發一個有兩個標簽的應用程序。 首先,我想從服務器加載數據並將其保存在共享的首選項中,並在列表視圖中進行分配。 如果共享首選項中有數據,則將首先從共享首選項中顯示數據,然后再次從服務器加載數據並替換它們。 兩個標簽都包含來自同一網址的不同數據。 數據在列表視圖中正確顯示,但是問題是,當數據從服務器加載時,當我返回主活動但仍在從服務器查找數據時,應用程序崩潰,共享優先級為空指針異常。

下面是我的代碼

public class Tab1 extends Fragment {
ListView ll;
Pojo pojo;
ListView dosList;
ProgressDialog nDialog;
String strServerResponse = null;
ArrayList<Pojo> dos;
DosAdapter dosAdapter;
SharedPreferences MyPrefs1;
ProgressBar nPregress;
ArrayList<String> tii1;
LayoutInflater inf;


@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.tab_1, container, false);

       return v;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


    dosList = (ListView) view.findViewById(R.id.doList);
    nPregress = (ProgressBar) getActivity().findViewById(R.id.toolbar_progress_bar);
    nPregress.setVisibility(View.GONE);
    dos = new ArrayList<Pojo>();

    SharedPreferences prefs = getActivity().getSharedPreferences("MyPref1", 0);
    Set<String> set = prefs.getStringSet("does", null);
    if (set != null) {

        for (String p : set) {
            pojo = new Pojo();
            pojo.setType(p);
            dos.add(pojo);

        }
        dosAdapter = new DosAdapter(getContext(), dos);
        dosList.setAdapter(dosAdapter);


    } else {
        new NetCheck(getContext()).execute();
    }

    new NetCheck(getContext()).execute();

}

private class NetCheck extends AsyncTask<Void, Void, Void> {
    private Context context;
    public NetCheck(Context context)
    {
        this.context=context;
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        nPregress.setVisibility(View.VISIBLE);

    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        dos.clear();
        nPregress.setVisibility(View.GONE);
        SharedPreferences prefs = getActivity().getSharedPreferences("MyPref1", 0);
        Set<String> set = prefs.getStringSet("does", null);
        for (String p : set) {
            pojo = new Pojo();
            pojo.setType(p);
            dos.add(pojo);

        }
        dosAdapter = new DosAdapter(getContext(), dos);
        dosList.setAdapter(dosAdapter);


        return;
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        try {
            HttpClient httpClient = new DefaultHttpClient();

            HttpPost httpRequest = new HttpPost(
                    "http://tipseducation.com/system/eadmin/getdoes_n_doesnot/");
            //"http://techie-web.com/android/testm/gcm_server_php/dosndonts.php");
            //"http://192.168.56.1:8080/Project/categories.php");
            httpRequest.setHeader("Content-Type", "application/json");

            JSONObject json = new JSONObject();

            StringEntity se = new StringEntity(json.toString());

            se.setContentEncoding("UTF-8");
            se.setContentType("application/json");

            httpRequest.setEntity(se);
            HttpResponse httpRes = httpClient.execute(httpRequest);

            java.io.InputStream inputStream = httpRes.getEntity()
                    .getContent();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream);
            BufferedReader reader = new BufferedReader(inputStreamReader);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            inputStream.close();
            strServerResponse = sb.toString();

            Log.e("Server Response", "" + strServerResponse.toString());

            if (strServerResponse != null) {
                try {

                    JSONArray arr = new JSONArray(strServerResponse);
                    JSONObject jsonObj = arr.getJSONObject(0);
                    tii1 = new ArrayList<String>();
                    for (int i = 0; i < arr.length(); i++) {
                        pojo = new Pojo();
                        JSONObject jobj2 = arr.getJSONObject(i);
                        String does = jobj2.optString("does");
                        tii1.add(does);

                    }

                    List<String> listTemp1 = tii1;
                    Set<String> temp1 = new HashSet<String>(listTemp1);
                    ////////////////////////Crashhhhhhhhhhhh///////////////////////////////
                    SharedPreferences.Editor editor5 = context.getSharedPreferences("MyPref1", 0).edit();
                    temp1.addAll(listTemp1);
                    editor5.putStringSet("does", temp1);
                    editor5.commit();


                } catch (JSONException e) {
                    e.printStackTrace();
                }

代碼中有什么問題嗎? 另一個選項卡的代碼相同。 誰能幫幫我嗎

Logcat

   java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.NullPointerException
        at com.example.priyanka.newdentalapp.Tab2$NetCheck.doInBackground(Tab2.java:192)
        at com.example.priyanka.newdentalapp.Tab2$NetCheck.doInBackground(Tab2.java:83)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)

在asynctask類中,您必須創建如下的構造函數:

private Context context;
public NetCheck(Context context)
{
      this.context=context;
}

之后,您必須使用上下文更改所有的getActivity()行。 而已。 試試這個,它將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM