2014-05-14 26 views
0

我有一點我不明白的小問題。在主線上顯示XML

這只是一個簡單的要求:如何顯示xml我剛剛進入一個線程?

有我的方法postData得到xml,我使其在log.v顯示,你可以在代碼中看到下面,但我不能把它顯示給TextView出線的。

public class RecupXml_Activity extends Activity { 

TextView campagne; 
String user = "toto"; 
String password = "tata"; 
String theCampagneXml; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_main); 

    campagne = (TextView) findViewById(R.id.campagneTest); 

    postData(user, password); 

} 

public void postData(final String login, final String password) { 

    Thread background = new Thread(new Runnable() { 
     URL url; 
     String buffer; 
     String theCampagneXml = null; 

     @Override 
     public void run() { 
      try { 

       URLConnection urlConnection; 

       String body = "login=" + URLEncoder.encode(login, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8"); 

       url = new URL("http://3pi.tf/apps/sms/"); 
       urlConnection = url.openConnection(); 

       ((HttpURLConnection) urlConnection).setRequestMethod("POST"); 

       urlConnection.setDoOutput(true); 
       urlConnection.setDoInput(true); 
       urlConnection.setUseCaches(false); 
       urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       urlConnection.setRequestProperty("Content-Length", "" + body.length()); 

       OutputStreamWriter writer = null; 
       BufferedReader reader = null; 
       writer = new OutputStreamWriter(urlConnection.getOutputStream()); 

       writer.write(body); 
       writer.flush(); 

       reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       while ((buffer = reader.readLine()) != null) { 
        theCampagneXml = buffer; 
       } 
       Log.v("test", "xml = " + theCampagneXml); 

      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
      } 

      campagne.post(new Runnable() { 

       @Override 
       public void run() { 
        campagne.setText("salut voici ta campagne : " + theCampagneXml); 

       } 
      }); 

     } 

    }); 
    background.start(); 
} 

}

它出現在我的Log但不是在TextView:/我有一個白色的空Activity

回答

1

的問題是,你叫postData()UI胎面,這意味着該方法也返回theCampagneXmlUI線程,而你的網絡操作那張工人線程。與一些修改和補充下面的代碼解決了這個問題:

public class MainActivity extends Activity { 

    TextView campagne; 
    String user = "toto"; 
    String password = "tata"; 
    String theCampagneXml; // new 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     campagne = (TextView) findViewById(R.id.text); 
     postData(user, password); // new 
    } 

public void postData(final String login, final String password) { // note: the return type has been changed 

Thread background = new Thread(new Runnable() { 
    URL url; 
    String buffer; 
    String theCampagneXml = null; // new 

    @Override 
    public void run() { 
     try { 
      // no changes here but declaring `theCampagneXml` as class member 
     } 
     campagne.post(new Runnable() { 

      @Override 
      public void run() { 
       campagne.setText("hello, here is your XML : "+ theCampagneXml); 
      } 
     }); 
    } 
}); 

background.start(); 
} 
} 

一旦網絡操作完成,並theCampagneXml被初始化,使用post()對於在UI線程運行TextView campagne

其他信息可在Processes and Threads找到。