我的应用程序遇到了一些困难。我创建了一个具有通过启动线程来处理HTTP POST的函数的类,问题是我无法在线程外发送数据!该类有一个变量,我想在线程运行时为该变量设置值,请帮忙。
以下是代码:
package com.mypackage;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;
import org.json.JSONException;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Handler;
import android.util.Log;
public class HandleJSON {
private String urlString = null;
private int errorcode ;
public int getErrorcode(){return errorcode;}
public volatile boolean parsingComplete = true;
public HandleJSON(String url){
//saving the URL
this.urlString = url;
}
@SuppressLint("NewApi")
public void readAndParseJSON(String in) {
try {
parsingComplete = false;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void fetchJSON(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
//receiving message from server
InputStream stream = conn.getInputStream();
String data = convertStreamToString(stream);
// JSON thing
try{
JSONObject obj = new JSONObject(data);
//THIS IS THE ISSUE, I'm setting here the errorcode which should set the superclass variable "errorcode" so I can use "getErrorCode" to retrieve the code, but it seems like the thread does not respond after thread starts;
errorcode = obj.getInt("error_code");
}
catch(JSONException e) {
Log.e("Catch error", e.toString());
}
readAndParseJSON(data);
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
}
答案 0 :(得分:0)
在这种情况下,匿名守护程序线程有点棘手。 您可以定义一个扩展Thread的具体类,在其中定义数据结构并提供访问数据结构的接口。如下所示。
class MyThread extends Thread {
private JSONObject obj;
public void run() {
// Your parsing code goes here
// Such as obj = xxxxxx;
}
public JSONObject getData() {
return obj;
}
}
当然,在操作内部数据结构时应考虑并发风险。
答案 1 :(得分:0)
如果我理解正确,您希望在非主线程和其他地方之间获取数据。在这种情况下,您可能希望创建另一个具有public static
变量的类。这样,相关修饰符(private
,protected
,public
)允许的每个人都可以访问相同的内容。要小心,如果管理不善,您的代码可能会以不同的方式运行,或者不能在执行速度不同于您的系统上运行。
答案 2 :(得分:0)
问题解决了,我使用AsyncTask代替并将变量传递给onPostExecute(String),完成了这一操作。