2012-05-26 7 views
5

ठीक है इसलिए मुझे थोड़ा सा पृष्ठभूमि देने की आवश्यकता है। सबसे पहले मैं फोनगैप 1.7 के साथ jquery-mobile का उपयोग कर रहा हूं। मैंने एक बहुत ही सरल जावा सर्वर कोड किया है जो सर्वर सॉकेट ऑब्जेक्ट का उपयोग करता है। एंड्रॉइड फोन पर, मैं सर्वर से कनेक्ट करता हूं, और ऐसा करने पर सर्वर सॉकेट पर डेटा भेजता है। यह हिस्सा काम कर रहा है।एंड्रॉइड फोनगैप 1.7 जावास्क्रिप्ट फ़ंक्शन को कॉल करना

जिस हिस्से में मैं फंस गया हूं वह यह है कि मैं उस सॉकेट पर डेटा भेजने का इरादा रखता हूं जिसके लिए jquery मोबाइल UI को डेटा के स्वागत पर अपडेट किया जाना आवश्यक है।


उत्तर: साइमन एक बड़े पैमाने पर मदद की थी और मैं यह पता लगा उसकी मदद और this tutorial

बात यह है कि वास्तव में मारा मुझे धागा PhoneGap प्लगइन अपने आप में पैदा हो रही थी भी थे। एक बार मुझे एहसास हुआ कि, सब कुछ जगह में गिर गया। हालांकि, यहां रुचि रखने वाले किसी भी व्यक्ति के लिए कोड है। ध्यान रखें, मैंने ट्यूटोरियल से बहुत कुछ लिया। मैंने इन अवधारणाओं का परीक्षण करने के लिए बनाए गए बहुत ही सरल जावा सर्वर को भी शामिल किया है। मैंने सोचा कि शायद यह भविष्य में किसी की मदद करेगा। बस याद रखें, यह मूल रूप से अवधारणा का सबूत है।

मैं अपने वास्तविक आवश्यकताओं के अनुरूप इस प्लगइन सुधार की जरूरत है:

एंड्रॉयड गतिविधि: आयात org.apache.cordova.DroidGap;

import android.os.Bundle; 

public class ISSAndroidActivity extends DroidGap { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.loadUrl("file:///android_asset/www/index.html"); 
    } 
} 

PhoneGap प्लगइन:

import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.net.SocketException; 

import org.apache.cordova.api.*; 
import org.apache.cordova.api.PluginResult; 
import org.apache.cordova.api.PluginResult.Status; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

public class InvokeJavaScriptPlugin extends Plugin { 
    public static String PLUGIN_TAG = "InvokeJavaScriptPlugin"; 
    public static String PROCESS_DATA_ACTION = "processData"; 
    private String callBackId = ""; 

    @Override 
    public PluginResult execute(String action, JSONArray args, String callbackId) { 
     PluginResult pluginResult = null; 
     Log.d(PLUGIN_TAG, "Invoking Javascript w\\ NO_RESULT"); 

     if (action.equals(PROCESS_DATA_ACTION)) { 
      this.callBackId = callbackId; 
      startProcessingData(); 
      pluginResult = new PluginResult(Status.NO_RESULT); 
      pluginResult.setKeepCallback(true); 
     } else { 
      pluginResult = new PluginResult(Status.INVALID_ACTION); 
      Log.e(PLUGIN_TAG, "Invalid action : " + action); 
     } 
     return pluginResult; 
    } 

    /** 
    * Spawns a thread that connects to a server, and receives data from it 
    */ 
    private void startProcessingData() { 
     new Thread() { 
      @Override 
      public void run() { 

       // Socket Testing 
       ObjectOutputStream out; 
       ObjectInputStream in; 
       Socket requestSocket = new Socket(); 
       Object inboundObject; 

       SocketAddress ipAddr = new InetSocketAddress("192.168.1.2", 
         2012); 
       try { 
        requestSocket.connect(ipAddr); 

        out = new ObjectOutputStream(
          requestSocket.getOutputStream()); 
        out.flush(); 
        in = new ObjectInputStream(requestSocket.getInputStream()); 

        do { 
         inboundObject = in.readObject(); // Data is received 
                 // here 
         int processedData = ((Number) inboundObject).intValue(); 
         onProcessDataReadSuccess(processedData); 

        } while (requestSocket.isConnected()); 

       } catch (SocketException ex) { 
        Log.d(PLUGIN_TAG, "Connection to Server lost"); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }.start(); 
    } 

    /** 
    * Callback method for startProcessingData(). Sends the result up to 
    * javascript layer via Plugin.success()<br> 
    * This method is automatically called asynchronously when processing is 
    * finished. 
    * 
    * @param processedData 
    *   the result of data processing which will be passed back to 
    *   javascript. 
    */ 
    private void onProcessDataReadSuccess(int processedData) { 
     Log.d(PLUGIN_TAG, "Processing data: " + processedData); 
     PluginResult result; 
     try { 
      JSONObject resultJSON = new JSONObject(); 
      resultJSON.put("processedData", processedData); 
      result = new PluginResult(Status.OK, resultJSON); 
     } catch (JSONException jsonEx) { 
      Log.e(PLUGIN_TAG, "Got JSON Exception " + jsonEx.getMessage()); 
      jsonEx.printStackTrace(); 
      result = new PluginResult(Status.JSON_EXCEPTION); 
     } 

     result.setKeepCallback(true); 
     this.success(result, this.callBackId); 
    } 
} 

index.html:

<!DOCTYPE html> 
<html> 
<head> 
<title></title> 
<meta name="viewport" content="width=device-width, initial-scale=1" /> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
<link type="text/css" href="css/jquery.mobile-1.1.0.min.css" 
    rel="stylesheet" /> 
</head> 
<script type="text/javascript" charset="utf-8" 
    src="scripts/cordova-1.7.0.js"></script> 
<script type="text/javascript" src="scripts/jquery-1.7.2.min.js"></script> 
<script type="text/javascript" src="scripts/jquery.mobile-1.1.0.min.js"></script> 
<script type="text/javascript" src="scripts/InvokeJavaScript.js"></script> 
<script type="text/javascript" charset="utf-8"> 
    document.addEventListener('deviceready', function() { 
     window.plugins.InvokeJavaScript.processData(function(result) { 
      displayProcessedData(result) 
     }, function(error) { 
      console.log(error) 
     }); 
    }, true); 

    function displayProcessedData(result) { 
     document.getElementById("processedData").innerHTML = result.processedData; 
    } 
</script> 

<body> 
    <div data-role="page"> 
     <div data-role="header" data-position="fixed"> 
      <h1>Demo</h1> 
     </div> 
     <div data-role="content"> 
      Result: 
      <div id="processedData"></div> 
     </div> 
     <div data-role="footer" data-position="fixed"> 
      <div data-role="navbar"></div> 
     </div> 
    </div> 
</body> 
</html> 

Server.java

import java.io.BufferedReader; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ISSServer { 

    private static Socket androidSocket; 
    private static ServerSocket serverSocket; 
    static ObjectOutputStream out; 
    static BufferedReader in; 

    public static void main(String[] args) { 
     System.out.println("Listen Thread: Waiting for connection"); 
     int port_number = 2012; // The default port 

     try { 
      serverSocket = new ServerSocket(port_number); 
      androidSocket = serverSocket.accept(); 

      System.out.println("Connection established"); 

      out = new ObjectOutputStream(androidSocket.getOutputStream()); 
      out.flush(); 
      // in = new BufferedReader(new 
      // InputStreamReader(androidSocket.getInputStream())); 

      out.writeObject(1337); 
      out.flush(); 
      out.reset(); 
      System.out.println("1337 sent"); 
      Thread.sleep(2000); 

      out.writeObject(9999); 
      out.flush(); 
      out.reset(); 
      System.out.println("9999 sent"); 
      Thread.sleep(2000); 

      out.writeObject(1234); 
      out.flush(); 
      out.reset(); 
      System.out.println("1234 sent"); 
      Thread.sleep(2000); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

कृपया इसे देखें। http://stackoverflow.com/questions/7947559/calling-javascript-from-eclipse-for-phonegap –

उत्तर

7

आप अपने आप पर कठिन करने के लिए इस तरह से कर रहे हैं। यदि आप फोनगैप प्लगइन का उपयोग करते हैं तो आप प्रारंभिक जावास्क्रिप्ट कॉल की कॉलबैक आईडी को सहेजने में सक्षम होंगे, फिर आप एक प्लगइन रीसेट भेजें जिसे आप परिणाम कहते हैं .setKeepCallback (true) और जहां स्थिति PluginResult.Status.NO_RESULT।

फिर जब भी आप जावा पक्ष पर जाते हैं और अपडेट करते हैं तो आप एक नया प्लगइन रिसेट बनाते हैं। स्थिति को ठीक से सेट करें, जो कुछ भी आप भेजना चाहते हैं उसे डेटा सेट करें और निश्चित रूप से इसे सेट करने से पहले KeepCallback (true)। फिर इस.success (callbackId, परिणाम) को कॉल करें और आपके जेएस पक्ष को निरंतर अपडेट मिलेंगे।

+0

यह दिलचस्प लगता है। मैं इस पर समय बिताने जा रहा हूं। यदि मैं डिवाइस के लिए एक ईवेंट श्रोता में प्रारंभिक फ़ंक्शन कॉल डालता हूं जो सॉकेट कनेक्शन स्थापित होने से पहले डिवाइस तैयार होने की समस्या को हल करेगा। हालांकि मैं NO_RESULT के बारे में सोच रहा हूं। प्रारंभिक के पास कोई परिणाम नहीं होगा, और मुझे लगता है कि यह समझ में आता है, लेकिन बाद में जब मैं वास्तव में कार्यवाही कर रहा हूं तो मैं स्थिति.ओके का उपयोग कर रहा हूं। क्या वह उस समारोह के आगे उपयोग को समाप्त नहीं करेगा? या वह कॉलबैक के पूरे बिंदु है? यह अन्य जेएस ऑपरेशंस को प्रदर्शन करने से नहीं रोकेगा? – Rakshasas

+0

नहीं, यह अन्य जेएस संचालन को प्रदर्शन से नहीं रोकेगा। अनुरोध एसिंक है इसलिए यह जेएस में यूआई थ्रेड को अवरुद्ध नहीं करेगा। साथ ही, जब तक आप pluginResult को वापस करने से पहले KeepCallback (true) सेट करते हैं, तो जावास्क्रिप्ट पक्ष कॉलबैक को साफ़ नहीं करेगा। मेरा विश्वास करो, इस प्रकार एक्सेलेरोमीटर और नेटवर्क स्थिति मूल फोनगैप एंड्रॉइड कोड में काम करती है। –

+0

धन्यवाद!मैं पहले समझ में नहीं आया था लेकिन आपने जो कहा है उसके बीच, एक और [यहां स्टैक ओवरफ्लो पर पोस्ट करें] (http://stackoverflow.com/a/7849762/865868) आपके द्वारा और यह [ट्यूटोरियल] (http: // www .speakingcode.com/2012/05/29/कॉल-नेटिव-एंड्रॉइड-जावा-कोड-से-html5javascript-use-phonegap-plugins-and-apply-async-callbacks /) मैंने इसे समझ लिया। आपको बहुत - बहुत धन्यवाद! – Rakshasas

संबंधित मुद्दे