Android 我的活动在4.0上运行良好,而不是在4.2上运行
我的活动在安卓4.1上不起作用,但在2.2、2.3和4.0上效果很好。我在下面粘贴的日志中显示了一些错误 发生了什么事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
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();