2014-03-30 30 views
-3

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

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什么像那样。代码很可能是非常蹩脚的。正因为如此,我并没有要求如何解决这个问题,而是要求如何从一开始就做到这一点。但是,如果你看到错误的位置,我很乐意听到它。

+2

此网站用于帮助用户解决与他们的代码有关的具体问题 - 您如何完成您要求的内容?大概有100种方法可以做到这一点。关键是你需要表现出一些努力,而不是期待人们为你做你的工作。注意你收到的问题?这是一个很好的指标,你需要做一些挖掘工作,然后回答一个符合以下指导原则的问题: http://stackoverflow.com/help/on-topic 由于成员厌倦一次又一次地看到这一点。 – SQLiteNoob

+0

@SQLiteNoob更好吗? – Rei

+0

是的!现在社区有一些东西可以合作。 – SQLiteNoob

回答

2

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

尽量addign以下到您的ProGuard配置文件:

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

编辑:

我真的认为,如果你已经使用Scala的为Android使用期货。另外,如果你在Scala中执行大部分代码,我也可以推荐Scaloid library

+0

是的,你完全正确。感谢您提供有关Futures和Scaloid图书馆的建议。我还没有尝试,因为我需要尽快完成应用程序,但我非常感谢您的帮助。 – Rei