【问题标题】:JSON Object is null although defined before inside a AsyncTask class?尽管之前在 AsyncTask 类中定义了 JSON 对象,但它是 null 吗?
【发布时间】:2015-03-11 19:42:30
【问题描述】:

我尝试通过收集 JSON 格式的信息来连接到 MySQL 数据库。我的代码接收这些信息。我创建了一个扩展AsyncTask 的类,在我的onPostExecute 类中,我想将完整的JSONArray 保存到JSONArray 之外的另一个JSONArray 中。这样做我不会收到错误消息,但是一旦我想使用这个对象,我的代码就会崩溃,我得到一个 java.lang.NullPointerException 并且我的新 JSON 数组为空。 有人可以帮帮我吗?

class task extends AsyncTask<String, String, Void>
{    
   InputStream is = null ;

   protected Void doInBackground(String... params) {
        String url_select = "http://pois.lima-city.de/test1.php";

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url_select);

        ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(param));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            //read content
            is =  httpEntity.getContent();

        } catch (Exception e) {

            Log.e("log_tag", "Error in http connection "+e.toString());
            //Toast.makeText(MainActivity.this, "Please Try Again", Toast.LENGTH_LONG).show();
        }
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = "";
            while((line=br.readLine())!=null)
            {
                sb.append(line+"\n");
            }
            is.close();
            result=sb.toString();

        } catch (Exception e) {
            // TODO: handle exception
            Log.e("log_tag", "Error converting result "+e.toString());
        }

        return null;

    }

    protected void onPostExecute(Void v) {
        try {


            LatLng coordinates;
            String between = "";
            JSONArray JarrayP = new JSONArray(result);
            myJSONArray = JarrayP;
          } catch (Exception e) {
            // TODO: handle exception
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }

PS:它在另一个类中。

【问题讨论】:

  • 你确定你在使用 myJSONArray after 它在 onPostExecute 中被初始化了吗?请记住,您正在执行 AsyncTask,这意味着您的 myJSONArray 不会立即准备好。对于适当的上下文,请包含更多相关代码。

标签: java android mysql json android-asynctask


【解决方案1】:

您目前在您的doInBackground(String...) 中返回Void。这就是为什么你在onPostExecute 中得到空值的原因。将您的班级更改为:

public class YourTask extends AsyncTask<String,Void,String>{
 ....

然后在doInBackground():

....
return result;

【讨论】:

    【解决方案2】:

    我看不出使用 result 字符串的意义,如果你只使用它来创建那个 json 数组。尝试从doInBackground 返回sb.toString()(而不是null)。为此,您需要修改异步任务。您的第三个通用变量应该是 String,并且您需要在 postExecute 标头中设置一个 String 参数。然后使用该字符串创建您的 json 数组。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多