【发布时间】:2015-09-13 19:34:29
【问题描述】:
我是 Andriod 编程的初学者,我使用 android Studio,但我在网上看到了一个使用 Eclipse 的 Http 教程,我在 Android Studio 中解释得最好,该应用程序有一个 HttpManager 类,它返回如下所示的 json 数据
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpManager {
public static String getData(String uri) throws IOException {
StringBuilder sb=new StringBuilder();
BufferedReader reader= null;
try {
URL url = new URL(uri);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
reader= new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line=reader.readLine()) !=null) {
sb.append(line+ "\n");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
return null;
}
finally {
if(reader != null){
reader.close();
}
}
return sb.toString();
}
}
主要活动,特别是 doInbackground 方法应该获取此 json 数据并显示它,但应用程序在下面的 onPrexecute 方法代码后崩溃
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v4.os.AsyncTaskCompat;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.security.Policy;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
TextView output;
ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
output=(TextView) findViewById(R.id.textView);
output.setMovementMethod(new ScrollingMovementMethod());
pb= (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.INVISIBLE);
}
@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
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
if (isOnline()){
requestData("http://localhost/database/getInfodroid.php");
}
else {
Toast.makeText(this,"Network Unavailable",Toast.LENGTH_LONG).show();
}
return true;
}
return super.onOptionsItemSelected(item);
}
private void requestData(String uri) {
MyTask task = new MyTask();
task.execute(uri);
}
protected void updateDisplay(String message){
output.append(message +"\n");
}
protected boolean isOnline(){
ConnectivityManager cm= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo netinfo= cm.getActiveNetworkInfo();
if(netinfo!= null && netinfo.isConnectedOrConnecting()){
return true;
}
else {
return false;
}
}
private class MyTask extends AsyncTask {
@Override
protected void onPreExecute() {
updateDisplay("Background Task Started");
pb.setVisibility(View.VISIBLE);
}
@Override
protected Object doInBackground(Object[] objects) {
try {
String content =HttpManager.getData(objects[0].toString());
return content;
} catch (IOException e) {
e.printStackTrace();
}
return "Task Complete";
}
@Override
protected void onPostExecute(Object o) {
updateDisplay(o.toString());
pb.setVisibility(View.INVISIBLE);
}
@Override
protected void onProgressUpdate(Object[] values) {
updateDisplay(values[0].toString());
}
}
}
我再说一遍,我很新,我在 Android Studio 中尽我所能解释它在 eclipse 中略有不同,设置所有权限
从本地主机更改为 IP 地址后,应用程序确实崩溃了,但我现在得到以下异常 LOGCAT:
10-03 14:13:21.876 2126-9411/? W/System.err: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused)
10-03 14:13:21.877 2126-9411/? W/System.err: at libcore.io.IoBridge.connect(IoBridge.java:124)
10-03 14:13:21.877 2126-9411/? W/System.err: at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
10-03 14:13:21.877 2126-9411/? W/System.err: at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
10-03 14:13:21.877 2126-9411/? W/System.err: at java.net.Socket.connect(Socket.java:884)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:160)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:67)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.Connection.connect(Connection.java:152)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:341)
10-03 14:13:21.877 2126-9411/? W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
10-03 14:13:21.878 2126-9411/? W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
10-03 14:13:21.878 2126-9411/? W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
10-03 14:13:21.878 2126-9411/? W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
10-03 14:13:21.878 2126-9411/? W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
10-03 14:13:21.878 2126-9411/? W/System.err: at hilz.myapplication.HttpManager.getData(HttpManager.java:22)
10-03 14:13:21.878 2126-9411/? W/System.err: at hilz.myapplication.MainActivity$MyTask.doInBackground(MainActivity.java:118)
10-03 14:13:21.884 2126-9411/? W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
10-03 14:13:21.884 2126-9411/? W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-03 14:13:21.901 2126-9411/? W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
10-03 14:13:21.901 2126-9411/? W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
10-03 14:13:21.901 2126-9411/? W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
10-03 14:13:21.902 2126-9411/? W/System.err: at java.lang.Thread.run(Thread.java:818)
10-03 14:13:21.902 2126-9411/? W/System.err: Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
10-03 14:13:21.902 2126-9411/? W/System.err: at libcore.io.Posix.connect(Native Method)
10-03 14:13:21.906 2126-9411/? W/System.err: at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
10-03 14:13:21.906 2126-9411/? W/System.err: at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
10-03 14:13:21.908 2126-9411/? W/System.err: at libcore.io.IoBridge.connect(IoBridge.java:122)
10-03 14:13:21.908 2126-9411/? W/System.err: ... 23 more
【问题讨论】:
-
您能否发布您的 logcat 输出,以便我们知道是什么引发了错误?
-
localhost/database/getInfodroid.php -> 我不认为你想要本地主机,因为它将是设备本地主机而不是你的 PC。我打赌您需要将 localhost 更改为服务器的 IP 地址。
-
我该如何解决它现在似乎无法连接到服务器但应用程序确实崩溃了
标签: android http android-asynctask