1

我正在编写一个 Android 应用程序,但遇到了一个问题:我得到了一个 null 而不是 ImmutableMap 对象。看来我的地图正在被垃圾收集。但我创建了对它的引用。所以这是我所有的源代码,在评论中详细描述了问题:

//I have a BaseActivity class in which i defined nested class
//which incapsulates some REST operations
public class BaseActivity extends Activity
 {   
//Here is this ImmutableMap to which I want save the result
private ImmutableMap<String, Object> serverData_;

//Here is this nested class which is AsyncTask
class RestfulNetworkTasks extends AsyncTask
    <Pair<String,LinkedHashMap<String, Object>>, Void, LinkedHashMap<String, Object>>
{    
     NetworkOperation LowLevelRestOperations_ = new NetworkOperation(); 
    @Override
    protected LinkedHashMap<String, Object> doInBackground(Pair<String,LinkedHashMap<String, Object>>... params)    
   { 
    return  LowLevelRestOperations_.executeServerCommand
          (params[0].getValue0(), params[0].getValue1());
    }
    protected void onPostExecute(LinkedHashMap<String, Object> result)
    {  
        //Here i created a reference to the result(in order
        //to save it in my data structure)
        serverData_ = copyOf(result);
        UpdateCurrentActivityAfterNetworkOperation();
        //Here I made a test output to check if i got the result
        //All is good - I got a correct result saved to serverData_
        android.util.Log.d("TEST RESPONSE", "ON POST" + serverData_);
    }
}//End of nested class declaration
   //Here is my method in which i want to call AsyncTask and got a problem
   public void  Login(LinkedHashMap<String,Object> parameters)
   {   
//Here I create an instance of that nested AsyncTask class
RestfulNetworkTasks serverOperation_ = new RestfulNetworkTasks();
Pair<String, LinkedHashMap<String, Object>> params_ = 
new Pair<String,LinkedHashMap<String,Object>>(LOGIN_COMMAND, parameters);
//Here I call AsyncTask operation - i got a correct ON POST output
     //with correct data
serverOperation_.execute(params_);

//But from this point my serverData_ is null!
//And I got null in AFTER POST output!Why?serverData_ is a member of BaseActivity so 
//it have to keep the result.
android.util.Log.d("TEST RESPONSE", "AFTER POST" + serverData_);
}

那么如何解决这个问题呢?为什么调用执行后我的 serverData_ 为空?

我真的需要帮助——我对 Java 和 Android 很陌生,这个问题让我抓狂。提前致谢。

4

4 回答 4

2

调用执行后我的 serverData_ 为空?

因为AsyncTask 是在单个后台线程上连续执行的, 而不需要等待 UI 线程(如线程),直到线程执行未完成。

如果您想在主 ui 线程上等待,直到 AsyncTasks 计算未完成并返回结果,请使用AsyncTask.get()

例子:

serverOperation_.execute(params_).get();  //<<<< 

// now u get latest value in serverData_
android.util.Log.d("TEST RESPONSE", "AFTER POST" + serverData_);
于 2013-03-06T12:11:43.220 回答
1

看来我的地图正在被垃圾收集。

不,这不是问题。您可能使用的对象不会被垃圾收集。永远不会。

真正的问题是变量在使用之前没有被赋值。

于 2013-03-06T12:10:30.360 回答
0

似乎对象 serverData_ 尚未初始化,在您调用的代码中 serverData_ = copyOf(result); 线程中的语句,可能会在将来执行,在此之前您使用 serverData_ 在 onPostExecute 完成之前将为空。请等到您的 AsyncTask 完成。

于 2013-03-06T12:18:49.063 回答
0

问题是 ImmutableMap。如果这是 google 版本,一旦创建就无法更改。一种解决方案是使用常规的 java 库函数来分配和构建 Map,然后使用 Collections 接口返回和不可修改的视图;就像是:

HashMap<String, Object> modifiableMap = new HashMap<String, Object>();   
modifiableMap.put("1", new Object());   
modifiableMap.put("2", new Object());   
Map<String, Object> unmodifiableMap = Collections.unmodifiableMap(modifiableMap);   

或者,您可以坚持使用 google 实现,但您需要使用他们的构建器方法;就像是:

ImmutableMap<String, Object> map = ImmutableMap.builder()
    .put(key, value);
    .build();
于 2013-03-06T12:19:15.703 回答