我想创建一个处理一些数据的Android应用程序,将输出作为数组并将此输出发送到服务器。为此,我在AsyncTask中进行处理和发送。
这是我的代码:
//Params, progress, result
public class MachineLearningTask extends AsyncTask<Integer, String, int[]>{
public interface TaskListener {
public void onFinished(int[] result);
}
private final static String TARGET_URL = "http://myURL";
private final static String CHARSET = "UTF-8";
private TaskListener taskListener;
private Context context;
private final ProgressDialog dialog;
private String activityTest;
public MachineLearningTask(Context ctx, String activity, TaskListener listener) {
context = ctx;
dialog = new ProgressDialog(context);
taskListener = listener;
activityTest = activity;
}
protected void onPreExecute() {
this.dialog.setMessage("Processing...");
this.dialog.show();
}
@Override
protected int[] doInBackground(Integer... params) {
// K-Means
KMeansClustering kmeans = new KMeansClustering(params[0]);
kmeans.mainKmeans();
// K-NN
KnnClustering knn = new KnnClustering();
KmeansAndKnnAnalysis kka = new KmeansAndKnnAnalysis();
kka.doAnalysis(kmeans,knn);
int[] occurrenceKMeans = kka.getKmeansOccurrenceArray();
int[] occurrenceKnn = kka.getKnnOccurrenceArray();
// Google e Most
GoogleAndMostAnalysis gma = new GoogleAndMostAnalysis();
gma.Google_Most_Recognized_Activity();
int[] occurrenceGoogle = gma.getGoolgeRecognizedActivity();
int[] occurrenceMost = gma.getMostRecognizedActivity();
FileOperation fo = new FileOperation();
fo.writeResult(activityTest, occurrenceKMeans, occurrenceKnn, occurrenceGoogle, occurrenceMost);
int idActivityKMeans = gma.findMax(occurrenceKMeans);
int idActivityKnn = gma.findMax(occurrenceKnn);
int idActivityGoogle = gma.findMax(occurrenceGoogle);
int idActivityMost = gma.findMax(occurrenceMost);
int[] matrixOccurrence = {idActivityKMeans, idActivityKnn, idActivityGoogle, idActivityMost};
JSONObject dataToSend = algorithmFeedback(matrixOccurrence);
JSONObject test = doFunc(dataToSend);
Log.d("HTTP_POST", dataToSend.toString());
return matrixOccurrence;
}
@SuppressLint("NewApi")
protected void onPostExecute(int[] result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (taskListener != null) {
taskListener.onFinished(result);
} else {
Toast.makeText(context, "Fail!", Toast.LENGTH_SHORT).show();
}
}
/* {"result":[
{"algorthm":"Kmeans", "readAct":"camminare", "trueAct":"camminare"},
{"algorthm":"Knn", "readAct":"camminare", "trueAct":"camminare"},
{"algorthm":"Google", "readAct":"camminare", "trueAct":"camminare"},
{"algorthm":"Most", "readAct":"camminare", "trueAct":"camminare"}
]}*/
private JSONObject algorithmFeedback(int[] result){
FileOperation fo = new FileOperation();
String algorithm;
String knowActivity;
JSONObject obj = new JSONObject();
JSONArray array = new JSONArray();
JSONObject item;
try{
for (int i = 0 ; i<result.length; i++){
item = new JSONObject();
algorithm = fo.getAlgorithmByIndex(i);
knowActivity = fo.idToActivity(result[i], algorithm);
item.put("algorithm", algorithm);
item.put("readAct", knowActivity);
item.put("trueAct", activityTest);
array.put(item);
}
obj.put("result", array);
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
private Boolean checkNetworkConnection(){
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
return true;
} else {
//Non è possibile connettersi
return false;
}
}
private JSONObject doFunc(JSONObject params) {
JSONObject serverResponse = null;
if(checkNetworkConnection() == true) {
Log.d("OK", "OK");
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(TARGET_URL);
urlConnection = (HttpURLConnection) url.openConnection();
Log.d("OK1", "OK1");
//To upload data to a web server, configure the connection for output using setDoOutput(true).
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Accept-Charset", CHARSET);
urlConnection.setRequestProperty("Content-Type", "application/json; charset="+CHARSET);
Log.d("OK2", "OK2");
//For best performance, you should call either setFixedLengthStreamingMode(int)
//when the body length is known in advance, or setChunkedStreamingMode(int) when it is not.
urlConnection.setChunkedStreamingMode(0);
//------------Request-----------
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
writeStream(out, params);
Log.d("OK3", "OK3");
//-----------Response----------
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
serverResponse = readStream(in);
Log.d("OK4", "OK4");
} catch (MalformedURLException e) {
e.printStackTrace();
serverResponse = null;
} catch (IOException e) {
e.printStackTrace();
serverResponse = null;
} finally {
urlConnection.disconnect();
}
}
return serverResponse;
}
private void writeStream(OutputStream out, JSONObject obj){
String clientData = obj.toString();
try {
out.write(clientData.getBytes(CHARSET));
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private JSONObject readStream(InputStream in) {
String serverResponse = in.toString();
JSONObject out = null;
try {
in.close();
out = new JSONObject(serverResponse);
} catch (IOException e) {
e.printStackTrace();
out = null;
} catch (JSONException e) {
e.printStackTrace();
out = null;
}
return out;
}
}
当我运行这个应用程序时,它可以正常工作,直到这行代码:
Log.d("OK2", "OK2");
在此之后,该应用程序显示ProgressDialog并且不执行任何操作。 一分钟后,应用程序崩溃。
这里有一部分堆栈跟踪:
11-27 20:05:39.921: D/OK(28449): OK
11-27 20:05:39.924: D/OK1(28449): OK1
11-27 20:05:39.925: D/OK2(28449): OK2
11-27 20:05:39.931: I/System.out(28449): (HTTPLog)-Static: isSBSettingEnabled false
11-27 20:05:39.924: I/System.out(28449): (HTTPLog)-Static: isSBSettingEnabled false
11-27 20:06:40.654: I/Timeline(28449): Timeline: Activity_idle id: android.os.BinderProxy@c079afe time:13153897
11-27 20:07:11.384: V/ActivityThread(28449): updateVisibility : ActivityRecord{8b423d2 token=android.os.BinderProxy@c079afe {org.most/com.unipa.activityrecognition.Experiment}} show : true
11-27 20:07:12.594: D/ViewRootImpl(28449): MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
11-27 20:07:49.004: W/System.err(28449): java.net.ConnectException: failed to connect to /192.168.1.4 (port 8080): connect failed: ETIMEDOUT (Connection timed out)
11-27 20:07:49.004: W/System.err(28449): at libcore.io.IoBridge.connect(IoBridge.java:124)
11-27 20:07:49.004: W/System.err(28449): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-27 20:07:49.004: W/System.err(28449): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
11-27 20:07:49.004: W/System.err(28449): at java.net.Socket.connect(Socket.java:884)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:434)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:105)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.Connection.connect(Connection.java:1331)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1410)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:466)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
11-27 20:07:49.004: W/System.err(28449): at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:249)
11-27 20:07:49.004: W/System.err(28449): at com.unipa.algorithm.MachineLearningTask.doFunc(MachineLearningTask.java:195)
11-27 20:07:49.004: W/System.err(28449): at com.unipa.algorithm.MachineLearningTask.doInBackground(MachineLearningTask.java:101)
11-27 20:07:49.004: W/System.err(28449): at com.unipa.algorithm.MachineLearningTask.doInBackground(MachineLearningTask.java:1)
11-27 20:07:49.004: W/System.err(28449): at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-27 20:07:49.004: W/System.err(28449): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-27 20:07:49.004: W/System.err(28449): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-27 20:07:49.004: W/System.err(28449): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-27 20:07:49.004: W/System.err(28449): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-27 20:07:49.004: W/System.err(28449): at java.lang.Thread.run(Thread.java:818)
11-27 20:07:49.004: W/System.err(28449): Caused by: android.system.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
11-27 20:07:49.004: W/System.err(28449): at libcore.io.Posix.connect(Native Method)
11-27 20:07:49.004: W/System.err(28449): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
11-27 20:07:49.004: W/System.err(28449): at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
11-27 20:07:49.004: W/System.err(28449): at libcore.io.IoBridge.connect(IoBridge.java:122)
11-27 20:07:49.004: W/System.err(28449): ... 24 more
11-27 20:07:49.004: D/HTTP_POST(28449): {"result":[{"algorithm":"KMEANS","readAct":"Fermo","trueAct":"Fermo"},{"algorithm":"KNN","readAct":"Fermo","trueAct":"Fermo"},{"algorithm":"GOOGLE","readAct":"still","trueAct":"Fermo"},{"algorithm":"MOST","readAct":"staticoSulTavolo","trueAct":"Fermo"}]}
11-27 20:07:49.014: D/ViewRootImpl(28449): #3 mView = null
11-27 20:07:49.014: D/Occurrence(28449): [0, 0, 0, 0]
11-27 20:07:56.264: I/Timeline(28449): Timeline: Activity_idle id: android.os.BinderProxy@c079afe time:13229504
你能帮我找到我错的地方吗?
解决方案:
问题是 Windows防火墙会阻止尝试连接的端口 因此,连接是及时的。 要在Windows中解决此问题,只需在Windows防火墙中创建一个例外。