0

runOnUiThread を使用して asyntask の UI を表示していますが、アプリがクラッシュします。postexecute で自分の Ui を直接表示するにはどうすればよいですか??? なぜrunOnUiThreadがクラッシュするのか混乱しています???? テキストビューの値を画面に表示するにはどうすればよいですか??

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

// TextView ingredient;

View row4;
int IOConnect = 0;
View row3;

String status;

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;
    TableLayout table;
String name;
    LinearLayout table3;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fifthscreen);
            table = (TableLayout) findViewById(R.id.table2);
           table3 = (LinearLayout) findViewById(R.id.table3);
}

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

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        parseJSONData();
    }
}

public void parseJSONData() {

    SelectMenuAPI = Utils.dishdescription;

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

        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.this.runOnUiThread(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"));

            // table3.addView(row2);

            //fifthscreen.this.runOnUiThread(new Runnable() {
            //  public void run() {
                    table3.addView(row4);
                //}
            //});

        }

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

  }
4

8 に答える 8

0

asynctask は doInBackground メソッドからの UI 更新を許可されていないため、doInbackground() からこのメソッド parseJSONData() を削除します。このメソッドを onPostExecute() に配置すると、確実に機能します。doInBackground() メソッドで UI を更新できないためです。

于 2013-10-04T06:25:50.550 に答える
0

このメソッドで UI を変更する必要はありません。同じアクティビティで UI の変更を含むメソッドを簡単に呼び出すことができ、onPostExecute メソッドでそのメソッドを呼び出すことができます。

UI を変更せずに doInBackground() で parseJSONData() を呼び出すことをお勧めします。

于 2013-10-04T06:59:53.810 に答える
0

doInBackground にはparseJSONData()

parseJSONData()あなたには以下があります

 ((TextView) row3.findViewById(R.id.apprentTemp))

   .setText(school3.getJSONObject(s).getString("name"));

の UI を更新していdoInBackground()ます。おそらく例外が発生しています。UI スレッドと同期していないバックグラウンド スレッドから UI を更新することはできません。

textviewクラス メンバーとして宣言しました。で初期化しonCreateます。asynctask はアクティビティ クラスの内部クラスです。

そのため、json オブジェクトを に返しますdoInbackground。計算結果はdoInbackgroundへのパラメータonPostExecuteです。結果に基づいて、テキストビューが更新されますonPostExecute

これらを初期化する必要がありますtxt1, txt2, txt3。また、 で新しいレイアウトを膨らませているようですparseJSONData()。理由はわかりません。でテキストビューを初期化できます で更新onCreateできますtxt1, txt2, txt3onPostExecute

于 2013-10-04T06:14:02.753 に答える
0
you are Accessing UI Element into you are do in background...remove it..
1) 
you can return the values from you method public JSonObject parseJSonData()..
2)
now change the AsynTask<Void,Void,String>
public String doInBackGround(Void..arg){}
public onPostExecute(String...arg)

{
//use the TextField here to print the data
}

Try it..this could help...
于 2013-10-04T06:15:11.510 に答える
0

問題は以下のコードにあると思います。

  fifthscreen.this.runOnUiThread(new Runnable() {
            public void run() {
                table3.addView(row4);
            }
        });

スレッドで UI を更新することはできないため、runOnUiThread を削除して UI を更新し、ビューを直接追加してください。

于 2013-10-04T06:24:12.233 に答える
0

のビューを更新しないでくださいdoInBackground()

すべてのレイアウト、TextView Globally を宣言します。

値を作成ArrayList<String> myArraylist1,myArraylist2して保存します。

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

           myArraylist1.add(school5
                    .getJSONObject(i).getString("name"));
          myArraylist2.school5.getJSONObject(i).getString(
                            "sub_ingredients"));
}

にすべての値とビューを追加しますonPostExecute()

textname.setText(myArraylist1.get(0));
于 2013-10-04T06:33:44.823 に答える