无法在可运行线程外发送数据
Cannot send data outside runnable thread
我的应用程序遇到了一些问题。我通过启动线程创建了一个 class 具有处理 HTTP POST 功能的函数,问题是我无法在线程外发送数据!!! class 有一个变量,我想在线程为 运行 时为该变量设置值,请帮忙。
代码如下:
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() : "";
}
}
在这种情况下,匿名守护线程有点棘手。
您可以定义一个具体的 class 扩展线程,在其中定义数据结构并提供访问您的数据结构的接口。如下图。
class MyThread extends Thread {
private JSONObject obj;
public void run() {
// Your parsing code goes here
// Such as obj = xxxxxx;
}
public JSONObject getData() {
return obj;
}
}
当然,在操作内部数据结构时,你应该考虑并发风险。
如果我没理解错的话,你想在非主线程和其他地方之间获取数据。在这种情况下,您可能希望创建另一个具有 public static
变量的 class。这样一来,相关修饰符 (private
、protected
、public
) 允许的每个人都可以访问相同的内容。请注意,如果管理不善,您的代码在执行速度不同于您的系统上的功能可能会有所不同或无法正常运行。
问题解决了,我改用 AsyncTask 并将变量传递给 onPostExecute(String),这就成功了。
我的应用程序遇到了一些问题。我通过启动线程创建了一个 class 具有处理 HTTP POST 功能的函数,问题是我无法在线程外发送数据!!! class 有一个变量,我想在线程为 运行 时为该变量设置值,请帮忙。
代码如下:
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() : "";
}
}
在这种情况下,匿名守护线程有点棘手。 您可以定义一个具体的 class 扩展线程,在其中定义数据结构并提供访问您的数据结构的接口。如下图。
class MyThread extends Thread {
private JSONObject obj;
public void run() {
// Your parsing code goes here
// Such as obj = xxxxxx;
}
public JSONObject getData() {
return obj;
}
}
当然,在操作内部数据结构时,你应该考虑并发风险。
如果我没理解错的话,你想在非主线程和其他地方之间获取数据。在这种情况下,您可能希望创建另一个具有 public static
变量的 class。这样一来,相关修饰符 (private
、protected
、public
) 允许的每个人都可以访问相同的内容。请注意,如果管理不善,您的代码在执行速度不同于您的系统上的功能可能会有所不同或无法正常运行。
问题解决了,我改用 AsyncTask 并将变量传递给 onPostExecute(String),这就成功了。