无法在runnable线程外发送数据

时间:2015-03-18 08:58:28

标签: java android json multithreading http-post

我的应用程序遇到了一些困难。我创建了一个具有通过启动线程来处理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() : "";
    }

}

3 个答案:

答案 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变量的类。这样,相关修饰符(privateprotectedpublic)允许的每个人都可以访问相同的内容。要小心,如果管理不善,您的代码可能会以不同的方式运行,或者不能在执行速度不同于您的系统上运行。

答案 2 :(得分:0)

问题解决了,我使用AsyncTask代替并将变量传递给onPostExecute(String),完成了这一操作。