2011-11-17 31 views
5

Tôi đã phát triển một Plugin Android PhoneGap. Plugin được gọi thành công, nhưng cuộc gọi lại không được gọi. Tôi không biết mình đã bỏ lỡ bất cứ thứ gì.PhoneGap Android Plugin: Thành công & Thất bại Gọi lại không được gọi là

Có ai có bất kỳ ý tưởng nào về những gì có thể sai khi gọi lại không được gọi?

Tiếp theo là mã của tôi:

JS tập tin Nội dung:

var SharedPreferencePlugin = function() {}; 

SharedPreferencePlugin.prototype.getvalues = function(content, success, fail) { 
    return PhoneGap.exec( 
     function(args) { 
      console.log("success called from plugin's js file");  
     }, 
     function(args) { 
      console.log("failure called from plugin's js file"); 
     }, 
     'SharedPreferencePlugin', 
     'getvalues', 
     [content] 
    ); 
}; 

SharedPreferencePlugin.prototype.update = function(itemName, success, fail) { 
    return PhoneGap.exec( 
     function(args) { 
      console.log("success called from plugin's js file");  
     }, 
     function(args) { 
      console.log("failure called from plugin's js file"); 
     }, 
     'SharedPreferencePlugin', 
     'update', 
     [itemName] 
    ); 
}; 

PhoneGap.addConstructor(function() { 
    PhoneGap.addPlugin('SharedPreferencePlugin', new SharedPreferencePlugin()); 
}); 

Java file:

public class SharedPreferencePlugin extends Plugin{ 

    public static final String GET_ACTION = "getvalues"; 
    public static final String UPDATE_ACTION = "update"; 
    static Context staticContext = MainActivity.staticContext; 
    SharedPreferences dataStorage = staticContext.getSharedPreferences(MainActivity.PREFS_NAME, 0); 

    public PluginResult execute(String action, JSONArray data, String callbackId) 
    { 
     Log.d("SharedPreferencePlugin", "Plugin Called with action: " + action); 
     PluginResult result = null; 
     if(action.equals(GET_ACTION)) 
     { 
      Log.d("SharedPrferencePlugin", "inside if for 'getvalues'"); 
      JSONArray savedData = getPreferences(); 
      Log.d("SharedPreferencePlugin", "Data: " + savedData); 
      result = new PluginResult(Status.OK, savedData); 
     } 
     else if(action.equals(UPDATE_ACTION)) 
     { 
      try 
      { 
       updateSharedPreferences(data.getJSONObject(0).getString("itemName")); 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("status", "success"); 

       result = new PluginResult(PluginResult.Status.OK, jsonObject); 
      } 
      catch(JSONException ex) 
      { 
       Log.d("SharedPreferencePlugin", "Got JSONException: " + ex.getMessage()); 
       result = new PluginResult(PluginResult.Status.JSON_EXCEPTION); 
      } 
     } 
     else 
     { 
      result = new PluginResult(PluginResult.Status.JSON_EXCEPTION); 
      Log.d("SharedPreferencePlugin", "Invalid action: " + action + " obtained."); 
     } 
     return result; 
    } 

    public void updateSharedPreferences(String itemName) 
    { 
     Log.d("SharedPreferencePlugin", "Inside updateSharedPreferences, value passed: " + itemName); 
     SharedPreferences tmpPreferenceReference = staticContext.getSharedPreferences(MainActivity.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = tmpPreferenceReference.edit(); 

     if(itemName.equals(tmpPreferenceReference.getString(MainActivity.NAME_ITEM1, ""))) 
     { 
      Integer tmpInt = Integer.parseInt(tmpPreferenceReference.getString(MainActivity.QUANTITY_ITEM1, "0")) - 1; 
      editor.putString(MainActivity.QUANTITY_ITEM1, tmpInt.toString()); 
     } 
     editor.commit(); 
    } 

    protected JSONArray getPreferences() 
    { 
     ArrayList<String> arrItemNames = new ArrayList<String>(); 
     ArrayList<String> arrItemQuantities = new ArrayList<String>(); 

     arrItemNames.add(0, dataStorage.getString(MainActivity.NAME_ITEM1, "")); 
     arrItemNames.add(1, dataStorage.getString(MainActivity.NAME_ITEM2, "")); 
     arrItemQuantities.add(0, dataStorage.getString(MainActivity.QUANTITY_ITEM1, "")); 
     arrItemQuantities.add(0, dataStorage.getString(MainActivity.QUANTITY_ITEM2, "")); 

     //------------------------------------------------------------------- 
     ArrayList<ArrayList> tempArrayList = new ArrayList<ArrayList>(); 
     tempArrayList.add(arrItemNames); 
     tempArrayList.add(arrItemQuantities); 

     JSONArray jsonData = new JSONArray(tempArrayList); 
     //------------------------------------------------------------------- 

     return jsonData; 
    } 
} 

HTML MÃ ĐỂ GỌI CHO CÁC PLUGIN:

function test() 
      { 
       console.log("Test called"); 
       window.plugins.SharedPreferencePlugin.getvalues({}, 
        function() { // Success function 
         console.log("success called"); 
        }, 
        function() { // Failure function 
         console.log('Share failed'); 
        } 
       ); 
      } 

Bất kỳ sự giúp đỡ được đánh giá cao.

Cảm ơn.

Trả lời

1

Cảm ơn các bạn đã trả lời.

Vì vấn đề không được giải quyết, tôi đã tạo lại một dự án thử nghiệm mới và từng bước đảm bảo rằng mỗi đoạn mã nhỏ hoạt động đúng và từ từ chuyển sang mục tiêu mong muốn cho plugin.

Cuối cùng tôi đã làm việc với dự án mới mà tôi đã tạo và viết lại Plugin từ đầu.

Cảm ơn.

+0

Chỉ cần thêm thông tin: Vấn đề của bạn là thay vì gọi thành công hoặc thất bại trong cuộc gọi PhoneGap.exec, bạn chỉ đăng nhập vào bảng điều khiển – scooterman

1

Khi bạn nói nó chắc chắn đang chạy mã gốc, bạn biết điều này như thế nào? Bạn đang nhìn thấy Log.d hoặc bạn đang thực sự đặt một điểm break trong và bước qua và nhìn thấy nếu kết quả trả về; dòng đang được thực hiện?

Ngoài ra, bạn đang sử dụng phiên bản điện thoại nào?

+0

Tôi đã cập nhật mã lên Phonegap 1.2. Có, tôi đã chèn 'Log.d' như bạn có thể thấy trong mã, và tôi có thể thấy đầu ra. Tuy nhiên, 'console.log' như trong các cuộc gọi lại không được in. Bất kỳ ý tưởng? –

+1

Chỉ là một suy nghĩ, bạn đang thử nghiệm thiết bị nào? Tôi tình cờ biết rằng không phải tất cả các thiết bị console.log thực sự xuất hiện trong logcat (ví dụ như HTC Desire HD). Hãy thử thay đổi chúng thành cảnh báo và xem chúng có hiển thị hay không. –

1

Nếu bạn đang sử dụng PhoneGap 1.2 bạn nên loại bỏ dòng:

PluginManager.addService("SharedPreferencePlugin","com.devapps.mmvspinningwheel.SharedPreferencePlugin"); 

vì nó là không cần thiết. Ngoài ra, có lẽ bạn nên di chuyển PhoneGap.addConstructor() xuống cuối tệp .js của bạn.

Dean không sai vì có một số thiết bị như HTC console.log không hoạt động bình thường, cũng như bạn đang thử nghiệm phiên bản Android nào?

+0

Xin chào Simon, tôi đã cập nhật mã JS của mình. Bạn đã đúng, 'PluginManager' đang đưa ra lỗi với PhoneGap 1.2. Tôi đã thêm mã HTML vào câu hỏi. và đầu ra 'console.log' được nhìn thấy trong Logcat. Tôi đang thử nghiệm trên Samsung Galaxy Tab 10.1 (phiên bản Android 3.1). Cảm ơn. –

Các vấn đề liên quan