2014-10-30 60 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 
      } 

    } 
}