Fragment中的AsyncTask不起作用并显示FATAL EXCEPTION:AsyncTask#1

时间:2015-04-26 07:10:37

标签: android android-asynctask httpresponse progressdialog

运行时以下代码会崩溃我的应用。我在MainActivity中调用它。跑步时告诉我:

FATAL EXCEPTION: AsyncTask #1并引导我走向ProgressDialogHttp Response

import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import com.montel.senarivesselapp.model.ShowDataList;
import com.montel.senarivesselapp.model.Vessel;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;

public class ShowallFragment extends Fragment {

    //variables for JSON query
    private static final String name ="vessel_name";
    private static final String etad="eta_date";
    private static final String etat="eta_time";
    private static final String etbd="etb_date";
    private static final String etbt="etb_time";
    private static final String shippingName="shipping_agent_name";
    private static final String v1 = "vessels";
    private static final String v2 = "Vessel";


    private ArrayList<Vessel> vList = new ArrayList<>();
    private ArrayAdapter arrayAdapter = null;
    private ListView listView = null;
    private EditText et = null;
    private ShowDataList ssadapter = null;
    private View rootView;

    public ShowallFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_showall, container, false);
        setContentView(R.layout.fragment_showall);
        setRetainInstance(true);


        return rootView;
    }

    private void setContentView(int fragment_showall) {

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }


    //For getting the JSON schedule from server
    class Schedule extends AsyncTask<String, String, String> {
        ProgressDialog loadDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Show the loading dialog
            loadDialog = new ProgressDialog(ShowallFragment.this);
            loadDialog.setMessage("Please wait....");
            loadDialog.setCancelable(false);
            loadDialog.show();

        }


        @Override
        protected String doInBackground(String... uri) {
            BufferedReader input = null;
            String data = null;

            try {

                DefaultHttpClient client = new DefaultHttpClient();

                HttpResponse response = client.execute(new HttpGet("http://"));
                StatusLine stline = response.getStatusLine();
                if (stline.getStatusCode() == HttpStatus.SC_OK) {
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    data = out.toString();
                    out.close();
                } else {
                    response.getEntity().getContent().close();
                    throw new IOException(stline.getReasonPhrase());
                }
            } catch (HttpResponseException he) {
                he.printStackTrace();
            } catch (ClientProtocolException cpe) {
                cpe.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (input != null) {
                    try {
                        input.close();
                        return data;
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                }
            }
            return data;
        }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        //Fill the vList array
        Log.d("POST EXECUTE", result.toString());
        loadDialog.dismiss();
        if (result != null) {
            try {
                JSONObject jo = new JSONObject(result);
                JSONArray vessels = jo.getJSONArray(v1);

                Log.d("VESSEL LOG", vessels.toString());
                vList = new ArrayList();

                for (int i = 0; i < vessels.length(); i++) {
                    JSONObject vv = vessels.getJSONObject(i);
                    Log.d("VESSEL NAME", vv.getJSONObject(v2).getString(name));

                    vList.add(new Vessel(vv.getJSONObject(v2).getString(name),
                            vv.getJSONObject(v2).getString(etad),
                            vv.getJSONObject(v2).getString(etat),
                            vv.getJSONObject(v2).getString(etbd),
                            vv.getJSONObject(v2).getString(etbt),
                                     vv.getJSONObject(v2).getString(shippingName)));

                }


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

        }

        listView = (ListView) rootView.findViewById(R.id.dataShow);
        listView.setAdapter(arrayAdapter);
        ssadapter = new ShowDataList(ShowallFragment.this , vList);
        listView.setAdapter(ssadapter);
    }




   }
}

2 个答案:

答案 0 :(得分:0)

onPostExecute()中将Log.d("POST EXECUTE", result.toString());的位置更改为内部捕获,因此您的代码将如下所示:

catch (Exception ee) {
                    ee.printStackTrace();
                }
catch (JSONException e) {
                Log.d("POST EXECUTE", e.toString());
            } // catch (JSONException e)

答案 1 :(得分:0)

 SecurityException: Permission denied (missing INTERNET permission

因此,您应该在项目AndroidManifest.xml文件中申请INTERNET权限。添加到位置:

 <uses-permission android:name="android.permission.INTERNET" />