1

我需要将异步任务结果传递给调用类。我创建了一个单独的 ASync 类,该类从其他类中调用。我正在将“Post Execute”方法中的异步任务的响应传递给调用类方法,但得到空点异常。下面是我的调用方法

public boolean getCategories() {

        serUri = "categories.json";
        WebServiceAsyncTask webServiceTask = new WebServiceAsyncTask();
        webServiceTask.execute(serUri,this);

        return true;
    }

使用下面 aysnc 任务的结果执行的方法是

public void writeJSONArray(final JSONArray result)
            {


                try {

                for (int i=0; i<result.length();i++){
                    JSONObject c = result.getJSONObject(i);

                    String name = c.getString("catname");

                }
            } catch (JSONException e) {
                 e.printStackTrace();
             }
            }

WebServiceAsyncTask 类:

public class WebServiceAsyncTask extends AsyncTask<Object,Void,JSONArray> {

    ROMSjson roms;
    private static JSONArray json = null;
    private Context context = null;

    protected JSONArray doInBackground(Object... params) {
        // TODO Auto-generated method stub
        String serviceUrl = (String) params[0];
         final HTTPHelper httph = new HTTPHelper(serviceUrl,context);
         if(serviceUrl.equalsIgnoreCase("categories.json")) {
             json = httph.fetch();

        }else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {

        }

        return json;
    }


@Override
protected void onPostExecute(JSONArray result) { // invoked on the ui thread

   roms.writeJSONArray(result);  

   super.onPostExecute(result);

}

roms.writeJSONArray(result)调用时出现空点异常。在此命令之前正确接收结果。我检查了 Log 语句。此外,如果我在 Async 类中编写 writeJSONArray 方法而不是调用类,则一切正常。

我不确定在传递结果或调用方法时是否遗漏了什么。请指教。谢谢。

4

3 回答 3

0

这是问题所在:

        else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {
          // if it falls to this condition then your json object appears to be null
        }

希望这可以帮助。

于 2013-08-08T04:31:48.077 回答
0
null pointer exception

因为roms is null

你在 ROMSjson roms;里面声明WebServiceAsyncTask但没有初始化它!

并在 `onPostExecute(JSONArray result) 中使用它

roms.writeJSONArray(result);`  // here roms in null

所以 initialize roms在使用之前!

于 2013-08-08T04:32:32.627 回答
0

接口是类之间传递数据的最佳方式。

创建公共接口

public interface WebCallListener{
void onCallComplete(JSONArray result);
}

在你的课堂上做什么?

public class WebServiceAsyncTask extends AsyncTask<Object,Void,JSONArray> {

    ROMSjson roms;
    private static JSONArray json = null;
    private Context context = null;


    //update
    private WebCallListener local;


    public WebServiceAsyncTask(WebCallListener listener){
     local=listener;
    }
   /////

    protected JSONArray doInBackground(Object... params) {
        // TODO Auto-generated method stub
        String serviceUrl = (String) params[0];
         final HTTPHelper httph = new HTTPHelper(serviceUrl,context);
         if(serviceUrl.equalsIgnoreCase("categories.json")) {
             json = httph.fetch();

        }else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {

        }

        return json;
    }


@Override
protected void onPostExecute(JSONArray result) { // invoked on the ui thread

//update

    super.onPostExecute(result);
   local.onCallComplete(result);  

}

来自您的呼叫课程。

public class CallingClass extends Activity{

 protecte void oncreate(Bundle b){

  new WebServiceAsyncTask(new WebCallListener() {

    @Override
    public void onCallComplete(JSONArray result) {
        //play with your response
    }
   });
 }
}
于 2013-08-08T04:57:22.083 回答