0

这是我的代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import android.os.AsyncTask;
import android.util.Log;

public class JsonController 
{
    private JSONObject inputData, json, finalResult;
    private String authentication;

    public JsonController()
    {
        json = new JSONObject();

        inputData = new JSONObject();
    }

    public void createAuthentication(String userName, String apiKey)
    {
        authentication = "";
    }


    public void setModel(String model) throws JSONException
    {
        json.put("model",model);
    }

    public void setData(String id, String deviceType) throws JSONException
    {
        inputData.put(id, deviceType);
    }



    public void getPrediction()
    {
        new sendJSon().execute("");
            return finalResult.toString();
    }




    private class sendJSon extends AsyncTask<String,Void,String>
    {

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            HttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(authentication);
            httppost.setHeader("Content-type", "application/json; charset=utf-8");

            try {
                  // Add your data
                  json.put("input_data", inputData);

                  StringEntity se = new StringEntity( json.toString());
                  httppost.setEntity(se); 

                  // Execute HTTP Post Request
                  HttpResponse response = httpclient.execute(httppost);

                  BufferedReader reader = new BufferedReader(
                          new InputStreamReader(
                                  response.getEntity().getContent(), "UTF-8"));
                  String jsonString = reader.readLine();
                  JSONTokener tokener = new JSONTokener(jsonString);

                  finalResult = new JSONObject(tokener);
              }
              catch(Exception e)
              {
                  Log.d("Error here", "Error is here",e);
              }


            return null;
        }

    }
}

getPrediction()由于NulPointerException. _ NullPointerException是因为 Async 任务需要时间来生成 String,并且该getPrediction()方法在它准备好之前返回该字符串。所有这些方法都是通过外部类调用的,那么我该如何解决呢?

4

5 回答 5

0

尝试String在您的doInBackground方法中返回:

  return jsonString;
于 2013-12-30T09:00:45.700 回答
0

您可以检查是否ASYNCTASK已完成执行,直到那时您可以停止从方法返回字符串getPrediction();

if(CLASSOBJECT!= null && CLASSOBJECT.getStatus() == Status.RUNNING) {
            //DO NOT RETURN ANY VALUE
        }else{
//RETURN VALUE
}
于 2013-12-30T08:58:26.923 回答
0

正如你所指出的

outNullPointerException is because the Async task take time to generate the
String, and the getPrediction() method returns the string before it is ready.

您应该在线程中运行基于网络的操作,doInBackground然后加入该线程。那么你应该打电话给getPrediction() in onPostExecute(). 因此,您将在调用该方法之前获得数据。

于 2013-12-30T09:01:26.500 回答
0

改为使用onPostExecute()onPostExecute()完成后接收返回值doInBackground()。从那里你可以对你的结果做任何需要做的事情。

如果onPostExecute()对您来说不够灵活,请考虑使用 CountDownLatch 来暂停您的主要代码执行,直到 AsyncTask 返回。

于 2013-12-30T09:02:32.403 回答
0

这是您可以实现的示例代码

public interface AsyncResponseHandler {
    public String resultCall(String resultStr);
}

public class MyMainClass extends Activity implements AsyncResponseHandler{

    public void doProcessing(){
        new AsynTasker(this).execute(null); //here this is instance of AsyncResponseHandler
    }

    @Override
    public String resultCall(String resultStr) {
        //here you will receive results from your async task after execution and you can carry out whatever process you want to do.
    }
}

public class AsynTasker extends AsyncTask<String,Void,String>{
    AsyncResponseHandler handler=null;
    public AsynTasker(AsyncResponseHandler handler){
      this.handler = handler
    }

    @Override
    protected String doInBackground(String... params) {
         // do your processing
         return resultString;
    }

    @Override
    protected void onPostExecute(String result) {
        this.handler.resultCall(result);
    }

}
于 2014-06-25T13:08:41.210 回答