0

如何在使用 Asyntask forloop 数据广告时更新 Ui 广告这一行:

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

我正在更新 forloop 中的 UI,但如果我使用 asyntask,我该怎么做?

   public class fifthscreen extends Activity {

           @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fifthscreen);

            parseJSONData();

}



   public void parseJSONData() {

    SelectMenuAPI = Utils.dishdescription + dish_name;

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

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

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

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

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

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





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

如何在 postexecute 中像这样更新 Ui

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

        }
    }

如何在其中显示这两行onPostExecute

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

3 回答 3

1

使用 MainActivity 中的 Handler 对象并发布一个可运行文件。要从背景中使用它,您需要使对象成为静态对象,您可以在 MainActivity 之外调用它,或者您可以创建 Activity 的静态实例来访问它。

活动内部

    private static Handler handler;


    handler = new Handler();

    handler().post(new Runnable() {

        public void run() {
            //ui stuff here :)
            final LinearLayout table3 = (LinearLayout) findViewById(R.id.table3);

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

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

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

    public static Handler getHandler() {
       return handler;
    }

活动之外

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

        public void run() {
            //ui stuff here :)
        }
    });
于 2013-10-02T07:08:54.250 回答
0

尝试像这样拆分您的代码。并在您获得 ui exeption 时添加处理程序

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

    getDataTask(){

    }

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

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        SelectMenuAPI = Utils.dishdescription + dish_name;

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

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

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

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

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

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





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

}

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
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"));
    }
}
于 2013-10-02T07:34:20.753 回答
-1
YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        //What you want to do, updating a UI in main thread ect.
    }
});

你也可以参考另一个帖子 这里

于 2013-10-02T07:31:06.750 回答