0

アプリケーションをクラッシュさせる非同期タスクでハンドラーを使用しています。ここにプロジェクトをアップロードしましたhttps://www.zeta-uploader.com/998997295

それは機能しており、問題は asytask 内でハンドラーを使用することだけで、アプリケーションがクラッシュします。
私の質問は、postexecute の json 解析ショーで for ループの値を取得するにはどうすればよいですか?

最初に値を取得してから postexecute に表示する別のアイデアはありますか?

メインコードアプリケーションのクラッシュでこの行を宣言すると、問題が解決します

row4 = getLayoutInflater().inflate(R.layout.row2, null);




           public class fifthscreen extends Activity {
String num = null;

long Menu_ID;
String dish_name;
View row4;
int IOConnect = 0;
View row3;

String status;
private static Handler handler;
HorizontalListView listview;
CategoryListAdapter3 cla;
String DescriptionAPI;

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;
String name;

String description;
String url1;

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

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

    androidAQuery = new AQuery(this);




    new getDataTask().execute();

}

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

}

public class getDataTask extends AsyncTask<Void, Void, Void> {

    getDataTask() {

    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        parseJSONData();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        // TODO Auto-generated method stub
        if (IOConnect == 0) {
            txt1.setText(name);
            txt3.setText(description);
            androidAQuery.id(img1).image(url1, false, false);


        }
    }
}

public void parseJSONData() {

    SelectMenuAPI = "http://198.57.208.46/~school/api/index/getDishDiscription?dish_name=American%20Cheese%20Burger";

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

    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), 8192);

        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");

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

                name = school2.getJSONObject(0).getString("name");

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

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

            }

            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);

                row3 = getLayoutInflater().inflate(R.layout.rows, null);
                ((TextView) row3.findViewById(R.id.localTime))
                        .setText(school3.getJSONObject(s).getString("qty"));
                ((TextView) row3.findViewById(R.id.apprentTemp))
                        .setText(school3.getJSONObject(s).getString("name"));

                fifthscreen.getHandler().post(new Runnable() {

                    public void run() {
                        table.addView(row3);
                    }
                });

            }



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

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

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

                row4 = getLayoutInflater().inflate(R.layout.row2, null);
                ((TextView) row4.findViewById(R.id.name)).setText(school5
                        .getJSONObject(i).getString("name"));
                ((TextView) row4.findViewById(R.id.subingredients))
                        .setText(school5.getJSONObject(i).getString(
                                "sub_ingredients"));

                fifthscreen.getHandler().post(new Runnable() {

                    public void run() {
                        table3.addView(row4);
                    }
                });

            }

        }

        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();
    }
}

private static Handler getHandler() {
    // TODO Auto-generated method stub
    return handler;
}

}

4

2 に答える 2

1

ハンドラーは ui スレッドで作成されます

新しいハンドラを作成すると、それを作成しているスレッドのスレッド/メッセージ キューにバインドされます。その時点から、メッセージとランナブルをそのメッセージ キューに配信し、メッセージから出てきたときにそれらを実行します。列。

また、間違っている doInbackground でレイアウトを無効にし、ビューを初期化および更新します。

あなたは電話parseJSONData()をかけdoInbackgroundます。parseJSONData()あなたには以下があります。 バックグラウンド スレッドから ui を更新することはできません

row3 = getLayoutInflater().inflate(R.layout.rows, null);
((TextView) row3.findViewById(R.id.localTime))
.setText(school3.getJSONObject(s).getString("qty"));
 ((TextView) row3.findViewById(R.id.apprentTemp))
 .setText(school3.getJSONObject(s).getString("name"));

doInbackgroundテキストビューの更新でJSONObjectを返しますonPostExecute

編集:

public class MainActivity extends Activity {
    String _response;
//  ArrayList<String> nam = new ArrayList<String>();
//  ArrayList<String> desc = new ArrayList<String>();
//  ArrayList<String> ur = new ArrayList<String>();
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv= (TextView) findViewById(R.id.textView1);
        new TheTask().execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


public class TheTask extends AsyncTask<Void, String, String> {

    @Override
    protected void onPreExecute() {
    super.onPreExecute();

    }

    @Override
    protected String doInBackground(Void... arg0) {



            try {
                String query = URLEncoder.encode("American%20Cheese%20Burger", "utf-8");
                String url = "http://198.57.208.46/~school/api/index/getDishDiscription?dish_name=American%20Cheese%20Burger";
                Log.i("url",""+url);
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet(url); 
                HttpResponse response = client.execute(request);
                HttpEntity resEntity = response.getEntity();
                 _response=EntityUtils.toString(resEntity);
//               JSONObject json = new JSONObject(_response);
//               String status = json.getString("status");
//               if (status.equals("1")) {
//              JSONArray school2 = json.getJSONArray("data");
//                for (int i = 0; i < school2.length(); i++) {
//                       String name = school2.getJSONObject(0).getString("name");
//                       nam.add(name);
//                       String  description = school2.getJSONObject(0).getString(
//                                           "description");
//                      desc.add(description);
//                      String url1 = school2.getJSONObject(0).getString("image");
//                      ur.add(url1);
//                   
//              }
//               }
//                JSONObject school3 = json.getJSONObject("dish_nutrition"); 
//                JSONObject jb2 = school3.getJSONObject("1");
//                String name1 =jb2.getString("name");
//                String qty =jb2.getString("qty");
//                JSONObject jb3 = school3.getJSONObject("2");
//                String name2 =jb3.getString("name");
//                String qty2 =jb3.getString("qty");
//               JSONArray jr = json.getJSONArray("dish_ingredient");
//                 for(int i=0;i<jr.length();i++)
//                 {
//                   JSONObject jb = (JSONObject) jr.get(i);
//                   String n = jb.getString("name");
//                   String sub= jb.getString("sub_ingredients");
//                 }
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        return _response;
    }


    @Override
    protected void onPostExecute(String result) {
    super.onPostExecute(result);
   tv.setText(result);

    }
}
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="17dp"
        android:text="TextView" />

</RelativeLayout>

スナップ

ここに画像の説明を入力

上記とは別に、解析も間違っています。

dish_nutrition": { 
            "1": {
                "name": "Cholesterol ",
                "qty": "2"
            },
            "2": {
                "name": "Chol (mg)",
                "qty": "3"
             }  

あなたが持っている

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

その後

  for (int j = 0; j < school3.length(); j++) {  // school3 is not a json array

{json オブジェクト ノードを表します

[json 配列ノードを表します

ビューで値を解析して表示するのはあなた次第です。要件に応じて上記を変更します

于 2013-10-04T17:57:18.817 に答える
0

バックグラウンドスレッドからUIを更新することはできないため、使用する場所

row4 = getLayoutInflater().inflate(R.layout.row2, null);

これは、onPostExecute更新する他の UI 要素と一緒に行う必要があります。

編集

parseJSONData()json 文字列を onPostExecute に返す

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

    return parseJSONData();
}

次に、 onPostExecute で他のすべてを行います

編集 2

asynctask は次のようにする必要があります

public class getDataTask extends AsyncTask<Void, Void, String> {

getDataTask() {

}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub

}

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

    return parseJSONData();
}

@Override
protected void onPostExecute(String result) {
    //result is the json string you go back from the server parse it in here now
}

}

于 2013-10-04T17:56:05.793 に答える