具有 HTTP 获取和获取的 AsyncTask。xml

AsyncTask with HTTP get and fetch of .xml

我正在开发一个 Android 应用程序,通过点击按钮我可以控制 Arduino 板的数字状态。 Arduino 使用在运行时创建的 XML 文件进行响应,通过获取其内容,我想显示引脚的实际状态。

现在,我意识到我的应用程序实际上可以正常工作,但我无法处理 AsyncTask 实例中的 fetchXML() 方法。有时我的 UI 死机了,我不想这样。

这是我主要的代码 activity:

public class MainActivity extends ActionBarActivity {

private String url = "http://192.168.0.254/?domotica";
private EditText button1,button2,button3,button4;
private HandleXML obj;

@Override
protected void onCreate(Bundle savedInstanceState) {

  /*  if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new     StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
  */
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button1 = (EditText)findViewById(R.id.editText1);
    button2 = (EditText)findViewById(R.id.editText2);
    button3 = (EditText)findViewById(R.id.editText3);
    button4 = (EditText)findViewById(R.id.editText4);



    Button led1on = (Button) findViewById(R.id.led_1on);
    Button led1off = (Button) findViewById(R.id.led_1off);

    led1on.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v){
            //commandArduino("http://192.168.0.254/?b1o");
            Invio inv = new Invio();
            inv.execute("http://192.168.0.254/?b1o");

        }
    });

    led1off.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v){
            //commandArduino("http://192.168.0.254/?b1f");
            Invio inv = new Invio();
            inv.execute("http://192.168.0.254/?b1f");
        }
    });

}

private class Invio extends AsyncTask<String,Void,String> {

 @Override
 protected String doInBackground(String... params) {
     int count = params.length;

     for (int i = 0; i < count; i++) {
         try {
             HttpClient httpclient = new DefaultHttpClient();
             httpclient.execute(new HttpGet(params[i]));
         } catch (Exception e) {
             e.printStackTrace();

         }
     }
     return null;
 }
}

public void open(View view){
    String finalUrl = url;
    obj = new HandleXML(finalUrl);
    obj.fetchXML();
    while(obj.parsingComplete);
    button1.setText(obj.getbutton1());
    button2.setText(obj.getbutton2());
    button3.setText(obj.getbutton3());
    button4.setText(obj.getbutton4());

}

/*public void commandArduino(String urlz) {


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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这就是我的 XML class 用来处理和获取 XML 文件和内容的代码:

public class HandleXML {

private String button1 = "button1";
private String button2 = "button2";
private String button3 = "button3";
private String button4 = "button4";
private String urlString = null;
private XmlPullParserFactory xmlFactoryObject;

public volatile boolean parsingComplete = true;

public HandleXML(String url){
    this.urlString = url;
}
public String getbutton1(){
    return button1;
}
public String getbutton2(){
    return button2;
}
public String getbutton3(){
    return button3;
}
public String getbutton4(){
    return button4;
}

public void parseXMLAndStoreIt(XmlPullParser myParser) {
    int event;
    String text=null;
    try {
        event = myParser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            String name=myParser.getName();
            switch (event){
                case XmlPullParser.START_TAG:
                    break;
                case XmlPullParser.TEXT:
                    text = myParser.getText();
                    break;

                case XmlPullParser.END_TAG:
                    if(name.equals("button1")){
                        button1 = text;
                    }
                    else if(name.equals("button2")){
                        button2 = text;// myParser.getText();
                    }
                    else if(name.equals("button3")){
                        button3 = text;//myParser.getText();
                    }
                    else if(name.equals("button4")){
                        button4 = text;//myParser.getText();
                    }
                    else{
                    }
                    break;
            }
            event = myParser.next();

        }
        parsingComplete = false;
    } catch (Exception e) {
        e.printStackTrace();
    }

}
public void fetchXML(){
    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                URL url = new URL(urlString);
                HttpURLConnection conn = (HttpURLConnection)
                        url.openConnection();
                conn.setReadTimeout(1000 /* milliseconds */);
                conn.setConnectTimeout(1500 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.connect();
                InputStream stream = conn.getInputStream();

                xmlFactoryObject = XmlPullParserFactory.newInstance();
                XmlPullParser myparser = xmlFactoryObject.newPullParser();

                myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES
                        , false);
                myparser.setInput(stream, null);
                parseXMLAndStoreIt(myparser);
                stream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();
}
}

根据@njzk 的建议,问题出在以下语句中:

while(obj.parsingComplete);

这会造成无限循环,我已将其删除,现在可以使用了。