2013-04-12 123 views
0

我試圖在單位轉換器上做一個應用程序。 我所做的所有其他實現,但我無法獲取貨幣的實時值。 我找到了一種「JSON解析」的方法。我搜索了它並創建了這個代碼。JsonParsing活動崩潰

package com.example.unitconverter; 

import java.io.IOException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

public class HttpExample extends Activity{ 

Spinner S1,S2; 
TextView tv; 
EditText et; 
Button abutton; 
HttpClient client; 
JSONObject json; 

static final String URL = "http://rate-exchange.appspot.com/currency?from="; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.currency); 

    S1=(Spinner)findViewById(R.id.spinner1); 
    S2=(Spinner)findViewById(R.id.spinner2); 
    et=(EditText)findViewById(R.id.editText1); 
    tv = (TextView) findViewById (R.id.textView1); 
    abutton=(Button)findViewById(R.id.button1); 
    client = new DefaultHttpClient(); 

    abutton.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 

      new Read().execute("rate"); 

     } 
    }); 


} 

public JSONObject retrieve(String from,String to) throws ClientProtocolException,IOException,JSONException{ 

    StringBuilder url = new StringBuilder(URL); 
    url.append(from + "&to=" + to); 

    HttpGet get = new HttpGet(url.toString()); 
    HttpResponse r = client.execute(get); 

    int status = r.getStatusLine().getStatusCode(); 
    if(status == 200){ 
     HttpEntity e = r.getEntity(); 
     String data = EntityUtils.toString(e); 
     JSONArray timeline = new JSONArray(data); 
     JSONObject last = timeline.getJSONObject(0); 

     return last; 

    } 
    else{ 
     Toast.makeText(HttpExample.this, "error",Toast.LENGTH_SHORT).show(); 
     return null; 

    } 

} 
public class Read extends AsyncTask<String,Integer,String>{ 

    @Override 
     protected void onPreExecute() { 
      Log.i("AsyncTask", "onPreExecute"); 
     } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 

     try { 


      json = retrieve(S1.getSelectedItem().toString(),S2.getSelectedItem().toString()); 

      return json.getString(params[0]); 
     } 
     catch (Exception e) { 
      // TODO Auto-generated catch block 
      Toast.makeText(HttpExample.this, "Exception", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
      return null; 
     } 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     Double F=Double.parseDouble(result); 
     Double D = Double.parseDouble(et.getText().toString()); 
     String newstring = Double.toString(D*F); 

     tv.setText(newstring); 

    } 
} 

}

XML文件包含含有貨幣縮寫,1的EditText,1個TextView的和1個按鈕 「轉換」 2個紗廠。 當我點擊「轉換」時,我收到一條消息,「不幸的是,UnitConverter停止工作」。

我是新來的android,因此不太瞭解錯誤,但我可以從LogCat瞭解的很多,doInBackground()函數中存在一些問題。

請提供幫助,因爲我提交此應用的最後日期非常近。

在此先感謝。

UPDATE:

04-12 16:26:36.494: E/AndroidRuntime(1853): FATAL EXCEPTION: main 
04-12 16:26:36.494: E/AndroidRuntime(1853): java.lang.NullPointerException 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at  java.lang.StringToReal.parseDouble(StringToReal.java:244) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at  java.lang.Double.parseDouble(Double.java:295) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at com.example.unitconverter.HttpExample$Read.onPostExecute(HttpExample.java:119) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at com.example.unitconverter.HttpExample$Read.onPostExecute(HttpExample.java:1) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.os.Looper.loop(Looper.java:137) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-12 16:26:36.494: E/AndroidRuntime(1853):  at dalvik.system.NativeStart.main(Native Method) 

UPDATE:

我得到了我error..I使用JSONArray代替的JSONObject。

public JSONObject retrieve(String from,String to) throws ClientProtocolException,IOException,JSONException{ 

    StringBuilder url = new StringBuilder(URL); 
    url.append(from + "&to=" + to); 

    HttpGet get = new HttpGet(url.toString()); 
    HttpResponse r = client.execute(get); 

    int status = r.getStatusLine().getStatusCode(); 
    if(status == 200){ 
     HttpEntity e = r.getEntity(); 
     String data = EntityUtils.toString(e); 
     JSONObject last = new JSONObject(data);  
     return last; 

    } 
    else{ 
     Toast.makeText(Currency.this, "Error!!!",Toast.LENGTH_SHORT).show(); 
     return null; 

    } 

謝謝大家

+1

logcat的,請... – jimpanzer

+0

@ jimpanzer-我已經添加了logcat的 –

回答

3

刪除此

Toast.makeText(HttpExample.this, "Exception", Toast.LENGTH_LONG).show(); 

doInBackgrond內。

由於doInBackground不能在UI線程中運行,您不允許在那裏執行UI操作。

所以把土司onPostExecute或runonUiThred

+0

在doInBackground,+1是的,你不能執行UI任務答案 – Sunny

+0

即使刪除後這個錯誤是相同的 –

+0

@AkshaySethi你在doInBackground中返回'null'並且你試圖對'null'值執行操作,你會得到'NullPointerException' – Pragnani