2014-10-30 46 views
0

我正在为Android的一个大计划工作,我试图让程序的货币转换器部分工作。为了充分披露:我从http://firstamong.com/building-android-currency-converter/中找到它,它是关于如何构建实时货币转换器的教程。我将发布有问题的代码,然后是logcat。发生的错误是当我尝试从一种货币转换为另一种货币时,应用程序说它被迫停止。然而, “无效” 部分工作(其中两个货币字段都相同的情况下。)任何帮助将真正意识到:Android的货币转换器应用程序

代码:

public class currency_converter extends Activity { 

public int to; 
public int from; 
public String [] val; 
public String s; 
public Handler handler; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_currency_converter); 
    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    Spinner s2 = (Spinner) findViewById(R.id.spinner2); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      this, R.array.name, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 
    val = getResources().getStringArray(R.array.value); 
    s1.setAdapter(adapter); 
    s2.setAdapter(adapter); 
    s1.setOnItemSelectedListener(new spinOne(1)); 
    s2.setOnItemSelectedListener(new spinOne(2)); 
    Button b = (Button) findViewById(R.id.button1); 
    b.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v) { 
      TextView t = (TextView) findViewById(R.id.textView4); 
      if(from == to) 
      { 
       Toast.makeText(getApplicationContext(), "Invalid", 4000).show(); 
      } 
      else 
      { 
       try { 
        s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
        JSONObject jObj; 
        jObj = new JSONObject(s); 
        String exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate"); 
        t.setText(exResult); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       catch (ClientProtocolException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 
} 
public String getJson(String url)throws ClientProtocolException, IOException { 

    StringBuilder build = new StringBuilder(); 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(url); 
    HttpResponse response = client.execute(httpGet); 
    HttpEntity entity = response.getEntity(); 
    InputStream content = entity.getContent(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
    String con; 
    while ((con = reader.readLine()) != null) { 
     build.append(con); 
    } 
    return build.toString(); 
} 
private class spinOne implements OnItemSelectedListener 
{ 
    int ide; 
    spinOne(int i) 
    { 
     ide =i; 
    } 
    public void onItemSelected(AdapterView<?> parent, View view, 
           int index, long id) { 
     if(ide == 1) 
      from = index; 
     else if(ide == 2) 
      to = index; 

    } 

    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 
    } 
class GetResponseData extends AsyncTask<String, String, String> { 
     private ProgressDialog dialog; 
     private ArrayList<String> titleList; 
     private TextView textView; 

     public GetResponseData(TextView textView) { 
      this.textView = textView; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = ProgressDialog.show(currency_converter.this, "", "Loading", 
        false); 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      try { 
       String s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22" + val[from] + val[to] + "%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
       JSONObject jObj; 
       jObj = new JSONObject(s); 
       String exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate"); 
       return exResult; 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return null; 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return null; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      if (dialog != null) 
       dialog.dismiss(); 
      if (result != null) { 
       textView.setText(result); 
      } 
     } 

    } 
} 

}

的logcat:

10-30 00:59:48.164 20591-20591/com.example.travelapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main 
android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128) 
     at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
     at java.net.InetAddress.getAllByName(InetAddress.java:214) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:587) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:511) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:489) 
     at com.example.travelapplication.currency_converter.getJson(currency_converter.java:93) 
     at com.example.travelapplication.currency_converter$1.onClick(currency_converter.java:68) 
     at android.view.View.performClick(View.java:4222) 
     at android.view.View$PerformClick.run(View.java:17620) 
     at android.os.Handler.handleCallback(Handler.java:800) 
     at android.os.Handler.dispatchMessage(Handler.java:100) 
     at android.os.Looper.loop(Looper.java:194) 
     at android.app.ActivityThread.main(ActivityThread.java:5391) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
     at dalvik.system.NativeStart.main(Native Method) 

回答

1

试试这个,,

你对它的mai执行网络操作n线程。这就是为什么你得到NetworkOnMainThreadException

b.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v) { 
      TextView t = (TextView) findViewById(R.id.textView4); 
      if(from == to) 
      { 
       Toast.makeText(getApplicationContext(), "Invalid", 4000).show(); 
      } 
      else 
      { 
       GetResponseData abcd = GetResponseData(t); 
       abcd.execute(); 
      } 
     } 
    }); 
1

它看起来像你必须在你的Android清单严格模式。当您在主线程上进行网络调用时,严格模式会投诉。您可以禁用严格模式,或者更好的方法是将网络调用放入异步任务中。有问题的网络电话是

HttpResponse response = client.execute(httpGet);

public String getJson(String url)

你需要异步任务已经在那儿了,你只需要使用它

更改这个else语句

else 
     { 
      try { 
       s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
       JSONObject jObj; 
       jObj = new JSONObject(s); 
       String exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate"); 
       t.setText(exResult); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

至此

else { 
    new GetResponseData().execute("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
} 

我希望这可以帮助。快乐的编码。

+0

我试过,但我得到一个 “无法解析符号'GetResponseData” 错误。有什么理由不找到我无法看到的GetResponseData类? – user2827137 2014-10-30 14:00:02

+0

查看你发布的代码后,我注意到'GetResponseData'是spinOne的内部类。尝试从'currency_converter'访问它会失败。您可能需要将其移至'currency_converter'或其自己的.java文件中。或者用'new spinOne.GetResponseData()。execute(“blah.blah.com”)来访问它''我将它移动到'currency_converter'的内部类中,这样你就没有嵌套太深的类。现在你在另一个类的内部私有类中有一个异步任务类。 – doubleA 2014-10-30 16:56:36

1

你得到:

NetworkOnMainThreadException 

的问题是,你在你的活动呼唤你的函数的getJSON()。

使用的AsyncTask:

public class ProcessTask extends AsyncTask<Void, Integer, String>{ 

    public ProcessTask() { 
     // TODO Auto-generated constructor stub 

    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

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

     //your code of parsing 
     StringBuilder build = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); //your yahooapi url goes here 
     HttpResponse response = client.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream content = entity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
     String con; 
     while ((con = reader.readLine()) != null) { 
      build.append(con); 
     } 
     return build.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 

     super.onPostExecute(result); 
    } 
} 
+0

只是为了清除这将取代我的GetResponse数据类或被添加额外?刚刚很困惑 – user2827137 2014-10-30 13:30:32

0

这将有助于使用:

public class CurrencyConverter extends Fragment { 
    public CurrencyConverter() { 
    } 
    TextView t; 
    public int to; 
    public int from; 
    public String[] val; 
    public String s; 
    String exResult; 
    public Handler handler; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     View rootView = inflater.inflate(R.layout.currency_converter, container, false); 
     t= (TextView) rootView.findViewById(R.id.textView4); 
     Spinner s1 = (Spinner) rootView.findViewById(R.id.spinner1); 
     Spinner s2 = (Spinner) rootView.findViewById(R.id.spinner2); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
       this.getActivity(), R.array.name, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 
     val = getResources().getStringArray(R.array.value); 
     s1.setAdapter(adapter); 
     s2.setAdapter(adapter); 
     s1.setOnItemSelectedListener(new spinOne(1)); 
     s2.setOnItemSelectedListener(new spinOne(2)); 

     Button b = (Button) rootView.findViewById(R.id.button1); 
     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View View) { 



       if (from == to) { 
        Toast.makeText(getActivity().getApplicationContext(), "Invalid", 4000).show(); 
       } else { 
        new calculate().execute(); 

       } 
      } 

     }); 
     return rootView; 
    } 

    public class calculate extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... args) { 

      try { 

       s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
       JSONObject jObj; 
       jObj = new JSONObject(s); 
       exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate"); 


      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return exResult; 

     } 
     @Override 
     protected void onPostExecute(String exResult) { 

      t.setText(exResult); 
     } 



     } 

    public String getJson(String url)throws IOException { 

     StringBuilder build = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse response = client.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream content = entity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
     String con; 
     while ((con = reader.readLine()) != null) { 
      build.append(con); 
     } 
     return build.toString(); 
    } 

     public class spinOne implements AdapterView.OnItemSelectedListener 
     { 
      int ide; 
      spinOne(int i) 
      { 
       ide =i; 
      } 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int index, long id) { 
       if(ide == 1) 
        from = index; 
       else if(ide == 2) 
        to = index; 

      } 

      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 
      } 

    } 
}