Android 我的活动在4.0上运行良好,而不是在4.2上运行

Android 我的活动在4.0上运行良好,而不是在4.2上运行,android,Android,我的活动在安卓4.1上不起作用,但在2.2、2.3和4.0上效果很好。我在下面粘贴的日志中显示了一些错误 发生了什么事 public class fifthscreen extends Activity { String num = null; TextView ingredient; ImageButton slideHandleButton; String name; String name2; long Menu_ID; Strin

我的活动在安卓4.1上不起作用,但在2.2、2.3和4.0上效果很好。我在下面粘贴的日志中显示了一些错误

发生了什么事

public class fifthscreen extends Activity {
    String num = null;
    TextView ingredient;
    ImageButton slideHandleButton;

    String name;
    String name2;
    long Menu_ID;
    String dish_name;
    String Type;
    String status;
    String message;
    // HorizontalListView listview;
    // CategoryListAdapter3 cla;
    String DescriptionAPI;
    // ImageLoader2 imgLoader;
    TextView txt1, txt2, txt3;
    ImageView img1;
    String URL, URL2;
    String SelectMenuAPI;
    static ArrayList < Long > Category_ID = new ArrayList < Long > ();
    static ArrayList < String > Category_name = new ArrayList < String > ();
    static ArrayList < String > Category_image = new ArrayList < String > ();
    public static String allergen2;

    // private AQuery androidAQuery;

    @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fifthscreen);
    ingredient = (TextView) findViewById(R.id.ingredient);
    img1 = (ImageView) findViewById(R.id.test_button_image);

    txt1 = (TextView) findViewById(R.id.menuname);
    // txt2 = (TextView) findViewById(R.id.test_button_text1);
    txt3 = (TextView) findViewById(R.id.description);

    Intent iGet = getIntent();

    ImageView options = (ImageView) findViewById(R.id.options5);
    // androidAQuery = new AQuery(this);

     options.setOnClickListener(new OnClickListener() {
                    @Override public void onClick(View v) {
                    Intent iMenuList = new Intent(fifthscreen.this, LinkButtons.class); startActivity(iMenuList);}});

    dish_name = iGet.getStringExtra("dish_name");

    ImageView btnback = (ImageView) findViewById(R.id.btnback);

    btnback.setOnClickListener(new OnClickListener() {
                   @Override public void onClick(View v) {
                   finish();}
                   });

    parseJSONData();

    }

    void clearData() {
    Category_ID.clear();
    Category_name.clear();
    Category_image.clear();

    }

    public void parseJSONData() {

    SelectMenuAPI = Utils.dishdescription + dish_name;

    // SelectMenuAPI = Utils.dishdescription;

    clearData();
    URL = SelectMenuAPI;
    URL2 = URL.replace(" ", "%20");

    // URL2 = SelectMenuAPI;

    try {

        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000);
        HttpConnectionParams.setSoTimeout(client.getParams(), 15000);
        HttpUriRequest request = new HttpGet(URL2);
        HttpResponse response = client.execute(request);
        InputStream atomInputStream = response.getEntity().getContent();
        BufferedReader in = new BufferedReader(new InputStreamReader(atomInputStream));

        String line;
        String str = "";
        while ((line = in.readLine()) != null) {
        str += line;
        }

        JSONObject json2 = new JSONObject(str);

        status = json2.getString("status");
        if (status.equals("1")) {

        JSONArray school2 = json2.getJSONArray("data");
        String[]mVal = new String[school2.length()];

        for (int i = 0; i < school2.length(); i++) {

            String name = school2.getJSONObject(0).getString("name");
            txt1.setText(name);

            String description = school2.getJSONObject(0).getString("description");

            txt3.setText(description);

            String url1 = school2.getJSONObject(0).getString("image");

            androidAQuery.id(img1).image(url1, false, false);

        }

        JSONObject school3 = json2.getJSONObject("dish_nutrition");

        final TableLayout table = (TableLayout) findViewById(R.id.table2);

        for (int j = 0; j < school3.length(); j++) {

            String s = String.valueOf(j + 1);

            final View row = createRow(school3.getJSONObject(s));
            table.addView(row);

        }

        JSONArray school4 = json2.getJSONArray("dish_allergen");
        //
        for (int i = 0; i < school4.length(); i++) {
            JSONObject object = school4.getJSONObject(i);

            Category_ID.add((long) i);
            Category_name.add(object.getString("name"));
            Category_image.add(object.getString("image"));
            listview.setAdapter(cla);

        }

        final LinearLayout table3 = (LinearLayout) findViewById(R.id.table3);

        JSONArray school5 = json2.getJSONArray("dish_ingredient");

        for (int i = 0; i < school5.length(); i++) {
            JSONObject jsonObject = school5.getJSONObject(i);

            final View row2 = createRow2(school5.getJSONObject(i));
            table3.addView(row2);

        }

        }

        else {

        JSONArray school2 = json2.getJSONArray("data");
        for (int i = 0; i < school2.length(); i++) {
            JSONObject object = school2.getJSONObject(i);

            Category_ID.add((long) i);
            Category_name.add(object.getString("name"));

        }

        }

    } catch(MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch(IOException e) {
        // TODO Auto-generated catch block
        // IOConnect = 1;
        e.printStackTrace();
    } catch(JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    public View createRow(JSONObject item) throws JSONException {
    View row = getLayoutInflater().inflate(R.layout.rows, null);
     ((TextView) row.findViewById(R.id.localTime)).setText(item.getString("qty"));
     ((TextView) row.findViewById(R.id.apprentTemp)).setText(item.getString("name"));

     return row;
    } public View createRow2(JSONObject item) throws JSONException {

    View row2 = getLayoutInflater().inflate(R.layout.row2, null);
     ((TextView) row2.findViewById(R.id.name)).setText(item.getString("name"));
     ((TextView) row2.findViewById(R.id.subingredients)).setText(item.getString("sub_ingredients"));

     return row2;
}}

发生这种情况的原因是缺少
AsyncTask
。将所有
HttpClient
逻辑放入
AsyncTask

从您的日志中:

android.os.NetworkOnMainThreadException
不能在主线程上运行
parseJSONData

下面是一些如何实现它的示例:

 private class AsyncRequestConnection extends AsyncTask<Void, Void, String> {
    private final Request request;

    public AsyncRequestConnection(Request request) {
        this.request = request;
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            HttpPost p = createRequestHttpMessage(request);
            String resp = new String(stripResponse(getRequestClient().execute(p)));
            Log.v(TAG, resp);
            return resp;
        } catch (Exception e) {
            Log.e(TAG, "Cannot complete API request", e);
            cancel(false);
            return null;
        }
    }

    @Override
    protected void onCancelled() {
        request.backoff();
        if (request.hasReachedMaxBackoff()) {
            request.cancel(R.string.error_internal);
        } else {
            requestQueue.enqueue(request);              
        }
        requestConnection = null;
        nextRequest();
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null) {
            request.attachResponse(result);
            request.handleResponse();               
            requestConnection = null;
            nextRequest();
        } else {
            request.cancel(R.string.error_internal);
        }
    }
}

所有与网络相关的操作都不能在UI线程中运行。这一定是问题的根源。更多细节。

我发布了一个示例,请阅读它并使您的代码适应该示例。使用哪个方法公共类getDataTask扩展AsyncTask{或AsyncRequestConnection task=new AsyncRequestConnection();
AsyncRequestConnection task=new AsyncRequestConnection();task.execute()
但在您的示例中,Async是seprate类。如何从那里更新ui?如何在mainActvitymake类中调用Asyntask并将其放入您的活动中
 private class AsyncRequestConnection extends AsyncTask<Void, Void, String> {
    private final Request request;

    public AsyncRequestConnection(Request request) {
        this.request = request;
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            HttpPost p = createRequestHttpMessage(request);
            String resp = new String(stripResponse(getRequestClient().execute(p)));
            Log.v(TAG, resp);
            return resp;
        } catch (Exception e) {
            Log.e(TAG, "Cannot complete API request", e);
            cancel(false);
            return null;
        }
    }

    @Override
    protected void onCancelled() {
        request.backoff();
        if (request.hasReachedMaxBackoff()) {
            request.cancel(R.string.error_internal);
        } else {
            requestQueue.enqueue(request);              
        }
        requestConnection = null;
        nextRequest();
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null) {
            request.attachResponse(result);
            request.handleResponse();               
            requestConnection = null;
            nextRequest();
        } else {
            request.cancel(R.string.error_internal);
        }
    }
}
 AsyncRequestConnection task = new AsyncRequestConnection ();
 task.execute();