2013-04-12 3 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 содержит 2 Спиннерса содержащих валюты аббревиатуру 1 EditText, 1 TextView и 1 кнопку "Конвертировать". Когда я нажимаю «Конвертировать», я получаю сообщение «К сожалению, 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 не работает в потоке пользовательского интерфейса, вам не разрешается выполнять работу интерфейса.

Так разместить Тост в onPostExecute или runonUiThred

+0

Да, вы не можете выполнять задачи пользовательского интерфейса в doInBackground, +1 для ответа – Sunny

+0

даже после удаления тост, ошибка такая же –

+0

@AkshaySethi Вы возвращаете 'null' в doInBackground, и вы пытаетесь выполнить операцию над значением« null », вы получите' NullPointerException' – Pragnani

Смежные вопросы