【问题标题】:Android app in Scala http requestScala http请求中的Android应用
【发布时间】:2014-03-30 15:27:55
【问题描述】:

我正在尝试使用 Scala 制作 Android 应用程序。它应该发出 GET 请求。我看到了一些实现此功能的 Java 代码,但这对我没有多大帮助。那么,有人可以解释我如何做到这一点,或者给出一个代码示例吗? 现在我有:

protected override def onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)

    val intent: Intent = getIntent()
    val massage: String = makeJson(intent.getExtras())
    val url:String = """http://something.I.dont.want.to.show?info=""" + URLEncoder.encode(massage, "utf-8")
    val req = new MyAsyncTask()
    req.execute(url)
    val data:JSONArray = req.get()

    // Create the text view
    val textView:TextView = new TextView(this)
    textView.setTextSize(40)
    textView.setText(data.toString())

    // Set the text view as the activity layout
    setContentView(textView)
}

还有 MyNewTask 类:

class MyAsyncTask extends AsyncTask[String, Void, JSONArray] {


override protected def doInBackground(arg0: String*): JSONArray = {
    val httpclient: HttpClient = new DefaultHttpClient()
    try {
        val response: HttpResponse = httpclient.execute(new HttpGet(arg0(0)))
        val statusLine: StatusLine = response.getStatusLine()
        if(statusLine.getStatusCode() == HttpStatus.SC_OK){
            val out:ByteArrayOutputStream = new ByteArrayOutputStream()
            response.getEntity().writeTo(out)
            out.close()
            val responseString = out.toString()
            new JSONArray(responseString)
            }
        else{
                //Closes the connection.
                response.getEntity().getContent().close()
                throw new IOException(statusLine.getReasonPhrase())
                null
            }
        }
    catch {
      case e: ClientProtocolException => {new JSONArray()}
      case ioe: IOException => {new JSONArray()}
    }
}

}

日志:

03-30 20:25:34.105: D/dalvikvm(30197): --- called into dvmAbstractMethodStub
03-30 20:25:34.105: D/AndroidRuntime(30197): Shutting down VM
03-30 20:25:34.105: W/dalvikvm(30197): threadid=1: thread exiting with uncaught exception (group=0x419d6930)
03-30 20:25:34.110: E/AndroidRuntime(30197): FATAL EXCEPTION: main
03-30 20:25:34.110: E/AndroidRuntime(30197): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myscalaandroidapp2/com.example.myscalaandroidapp2.DisplayMassageActivity}: java.util.concurrent.ExecutionException: java.lang.AbstractMethodError: abstract method not implemented
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread.access$700(ActivityThread.java:154)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.Looper.loop(Looper.java:137)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread.main(ActivityThread.java:5306)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.lang.reflect.Method.invokeNative(Native Method)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.lang.reflect.Method.invoke(Method.java:511)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at dalvik.system.NativeStart.main(Native Method)
03-30 20:25:34.110: E/AndroidRuntime(30197): Caused by: java.util.concurrent.ExecutionException: java.lang.AbstractMethodError: abstract method not implemented
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.util.concurrent.FutureTask.report(FutureTask.java:94)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.util.concurrent.FutureTask.get(FutureTask.java:160)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.AsyncTask.get(AsyncTask.java:482)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at com.example.myscalaandroidapp2.DisplayMassageActivity.onCreate(DisplayMassageActivity.scala:60)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.Activity.performCreate(Activity.java:5255)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
03-30 20:25:34.110: E/AndroidRuntime(30197):    ... 11 more
03-30 20:25:34.110: E/AndroidRuntime(30197): Caused by: java.lang.AbstractMethodError: abstract method not implemented
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.AsyncTask.doInBackground(AsyncTask.java)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
03-30 20:25:34.110: E/AndroidRuntime(30197):    at java.lang.Thread.run(Thread.java:856)
03-30 20:25:34.115: W/dalvikvm(30197): threadid=11: thread exiting with uncaught exception (group=0x419d6930)
03-30 20:25:34.115: I/Process(30197): Sending signal. PID: 30197 SIG: 9

如果我理解正确,它会在启动 AsyncTask 或类似的东西时失败。 代码很蹩脚,可能。因为它,我没有问如何解决它,而是从一开始就问如何去做。但如果你看到错误在哪里,我会很高兴听到它。

【问题讨论】:

  • 这个网站是为了帮助用户解决他们的代码的特定问题——你如何完成你的要求?可能有 100 种方法可以做到这一点。关键是你需要付出一些努力,而不是期望人们为你做你的工作。注意到您收到的问题 -7 了吗?这是一个很好的指标,表明您需要进行一些挖掘并提出符合这些准则的问题:stackoverflow.com/help/on-topic 您在没有任何 cmets 的情况下获得了否决票,因为成员厌倦了一次又一次地看到这一点。
  • @SQLiteNoob 这样更好吗?
  • 是的!现在社区有一些工作要做。

标签: android scala http get


【解决方案1】:

我的第一个赌注是,因为上面的代码没有直接引用 MyAsyncTask 的 doInBackground 方法,Progruard 将其删除。

尝试将以下内容添加到您的 proguard 配置文件中:

-keep class * extends android.os.AsyncTask {
  *;
}

编辑:

如果您已经在使用适用于 Android 的 Scala,我实际上会考虑使用 Futures。此外,如果您使用 Scala 编写大部分代码,我也可以推荐 Scaloid library。

【讨论】:

  • 是的,你完全正确。感谢您对 Futures 和 Scaloid 库的建议。我还没有尝试,因为我需要尽快完成应用程序,但我非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多