Приложение Http Client Server, получающее данные с локального узла и возрастающее исключение с удаленного сервера
Я новичок в разработке Android, я тестирую базовое приложение http клиент сервера после поиска на многих сайтах, я получил код, который я дал ниже. Этот код работает нормально для локального хоста, но выдает исключение, когда я пытаюсь получить доступ к ссылке на удаленный хост: http://gprecelectricus.org/sendMessage.php
Java-код:
package third.example.clientserverapp;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.R.string;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runOnUiThread(( new Runnable() {
public void run(){
HttpClient Client= new DefaultHttpClient();
HttpGet getData= new HttpGet("http://gprecelectricus.org/sendMessage.php");
try{
HttpResponse response= Client.execute(getData);
if(response!=null)
{
String line = "";
InputStream is= response.getEntity().getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while((line=br.readLine())!=null)
{
TextView tv= (TextView) findViewById(R.id.display_msg);
tv.setText(line);
}
}
}catch(Exception e){
e.printStackTrace();
TextView tv= (TextView) findViewById(R.id.display_msg);
tv.setText("caught exception");
}
}
});
}
@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;
}
}
logcat это:
01-26 20:14:20.596: W/System.err(1043): android.os.NetworkOnMainThreadException
01-26 20:14:20.616: W/System.err(1043): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
01-26 20:14:20.616: W/System.err(1043): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
01-26 20:14:20.616: W/System.err(1043): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-26 20:14:20.616: W/System.err(1043): at libcore.io.IoBridge.connect(IoBridge.java:112)
01-26 20:14:20.630: W/System.err(1043): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-26 20:14:20.636: W/System.err(1043): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
01-26 20:14:20.636: W/System.err(1043): at java.net.Socket.connect(Socket.java:842)
01-26 20:14:20.636: W/System.err(1043): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
01-26 20:14:20.636: W/System.err(1043): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
01-26 20:14:20.636: W/System.err(1043): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-26 20:14:20.647: W/System.err(1043): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-26 20:14:20.656: W/System.err(1043): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-26 20:14:20.656: W/System.err(1043): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-26 20:14:20.656: W/System.err(1043): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-26 20:14:20.656: W/System.err(1043): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-26 20:14:20.666: W/System.err(1043): at third.example.clientserverapp.MainActivity$1.run(MainActivity.java:32)
01-26 20:14:20.676: W/System.err(1043): at android.app.Activity.runOnUiThread(Activity.java:4591)
01-26 20:14:20.676: W/System.err(1043): at third.example.clientserverapp.MainActivity.onCreate(MainActivity.java:25)
01-26 20:14:20.686: W/System.err(1043): at android.app.Activity.performCreate(Activity.java:5008)
01-26 20:14:20.686: W/System.err(1043): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
01-26 20:14:20.686: W/System.err(1043): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
01-26 20:14:20.686: W/System.err(1043): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-26 20:14:20.686: W/System.err(1043): at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-26 20:14:20.686: W/System.err(1043): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-26 20:14:20.686: W/System.err(1043): at android.os.Handler.dispatchMessage(Handler.java:99)
01-26 20:14:20.697: W/System.err(1043): at android.os.Looper.loop(Looper.java:137)
01-26 20:14:20.706: W/System.err(1043): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-26 20:14:20.716: W/System.err(1043): at java.lang.reflect.Method.invokeNative(Native Method)
01-26 20:14:20.716: W/System.err(1043): at java.lang.reflect.Method.invoke(Method.java:511)
01-26 20:14:20.716: W/System.err(1043): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-26 20:14:20.726: W/System.err(1043): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-26 20:14:20.726: W/System.err(1043): at dalvik.system.NativeStart.main(Native Method)
01-26 20:14:20.867: W/EGL_emulation(1043): eglSurfaceAttrib not implemented
2 ответа
Пожалуйста, убедитесь, что:
В вашем AndroidManifest есть входное разрешение INTERNET
Основная деятельность
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://gprecelectricus.org/sendMessage.php");
try {
HttpResponse response = client.execute(request);
if (response != null) {
final String result = convertStreamToString(response.getEntity().getContent());
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv= (TextView) findViewById(R.id.display_msg);
tv.setText(result);
}
});
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private String convertStreamToString(InputStream is) throws IOException {
String line = "";
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while((line=br.readLine())!=null)
{
sb.append(line);
}
return sb.toString();
}
while((line=br.readLine())!=null)
{
TextView tv= (TextView) findViewById(R.id.display_msg);
tv.setText(line);
}
Вы не можете изменить пользовательский интерфейс из другого потока.
Использование runOnUIThread
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while((line=br.readLine())!=null)
{
TextView tv= (TextView) findViewById(R.id.display_msg);
tv.setText(line);
}
}
});