【问题标题】:URL cannot be cast to StringURL 不能转换为字符串
【发布时间】:2014-02-18 06:27:56
【问题描述】:

我是 android 的新手,正在尝试开发应用程序以将所有 mp3 文件从服务器加载到列表视图,并通过单击列表项它应该直接从服务器播放该 mp3 文件。

不知何故,我能够列出从服务器到列表视图的所有 mp3 文件,但是当我单击列表视图的项目播放该特定歌曲时,它给了我以下错误。

Logcat

02-18 11:49:58.266: E/AndroidRuntime(8276): FATAL EXCEPTION: main
02-18 11:49:58.266: E/AndroidRuntime(8276): java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String
02-18 11:49:58.266: E/AndroidRuntime(8276):     at iqual.fidol_final.ServerFileList$1.onItemClick(ServerFileList.java:72)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AdapterView.performItemClick(AdapterView.java:295)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView.performItemClick(AbsListView.java:1073)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2577)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.widget.AbsListView$1.run(AbsListView.java:3302)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Handler.handleCallback(Handler.java:605)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.os.Looper.loop(Looper.java:154)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at android.app.ActivityThread.main(ActivityThread.java:4624)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at java.lang.reflect.Method.invokeNative(Native Method)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at java.lang.reflect.Method.invoke(Method.java:511)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
02-18 11:49:58.266: E/AndroidRuntime(8276):     at dalvik.system.NativeStart.main(Native Method)

Java 代码

public class ServerFileList extends Activity implements
        OnBufferingUpdateListener, OnErrorListener, OnPreparedListener {

    Uri uri;
    URL urlAudio;
    ListView mListView;
    PlaySongAsy play;

    ProgressDialog pDialog;
    JSONParser jParser = new JSONParser();
    MediaPlayer mp = new MediaPlayer();
    private List<String> myList = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.serverfilelist);

        mListView = (ListView) findViewById(R.id.listAudio);

        if (Const.server == 0) {
            new getAudiofromServer().execute();
        } else {
            new getVideofromServer().execute();
        }

        // new downloadAudio().execute();

        mListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // playSong(urlAudio + myList.get(position));
                play = (PlaySongAsy) new PlaySongAsy(myList.get(position)
                        .replace(" ", "%20").trim()).execute();
            }
        });
    }

    class PlaySongAsy extends AsyncTask<String, Void, Boolean> {

        String baseURL;

        public PlaySongAsy(String baseURL) {
            this.baseURL = baseURL;
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            pDialog = ProgressDialog.show(ServerFileList.this,
                    "    Buffering...", "please wait..", false);
            pDialog.setCancelable(false);

        }

        @Override
        protected Boolean doInBackground(String... urls) {
            new Thread() {
                @Override
                public void run() {
                    play(baseURL);
                }
            }.start();
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            // progressDialog.dismiss();
        }
    }

    private void play(String baseURL) {
        Uri myUri = Uri.parse(baseURL);
        try {
            if (mp == null) {
                this.mp = new MediaPlayer();
            } else {
                mp.stop();
                mp.reset();
            }
            mp.setDataSource(this, myUri); // Go to Initialized state

            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setOnPreparedListener(this);
            mp.setOnBufferingUpdateListener(this);
            mp.setOnErrorListener(this);

            mp.prepareAsync();

            // mp.setVolume(5.F, 5.F);

            Log.d("", "LoadClip Done");
        } catch (Throwable t) {
            Log.d("", t.toString());
        }
    }

    public void updateProgress(int currentSize, int totalSize) {
        TextView mTextView = new TextView(ServerFileList.this);
        mTextView.setText(Long.toString((currentSize / totalSize) * 100) + "%");
    }
    }

【问题讨论】:

  • doInbackground 在后台线程上调用。你有什么需要在那里开始一个新线程?
  • playSong(urlAudio.toString() + myList.get(position));,注意toString
  • @Raghunandan,你想说什么,对不起,我没听明白。
  • @IK-45 为什么需要在doInbackground 中启动一个线程。在doInBackground 中删除new Thread() {..
  • @RC.,这是注释部分,现在我不使用该方法。我正在尝试使用 Asynctask 来实现。

标签: java android android-listview android-asynctask android-mediaplayer


【解决方案1】:

代码:

myList.get(position)

myList 的元素隐式转换为String,因为myListList&lt;String&gt;。这是失败的,因为您设法将URL 对象插入myList

启用“未经检查的强制转换”警告,您应该会在插入 myList 的位置看到警告。

两个可能的修复:

  1. 消除未经检查的演员表。其中一部分可能涉及在您的URL 上调用.toString(),然后再将其添加到myList

  2. 或者,将myList的类型改为List&lt;URL&gt;,然后在onItemClick内部调用.toString()

您选择哪一种取决于您希望myList 拥有的类型。

【讨论】:

    【解决方案2】:

    我认为myList 包含错误的对象。你把URIs 放在里面,而不是Strings。填写列表时,在Uris 上使用toString 方法。

    查找您执行此操作的位置:

    myList.add((String)uri);
    

    并更改为:

    myList.add(uri.toString());
    

    【讨论】:

    • 我使用了 ivy apache 库来列出所有文件,所以我的 mylist 是 myList = lister1.listAll(urlAudio); 就像这样,而不是 myList.add(uri.toString()); 那么我该如何更改呢。
    【解决方案3】:

    在 URL 对象上调用toString() 方法以获取字符串形式。 参考http://docs.oracle.com/javase/6/docs/api/java/net/URL.html#toString%28%29

    【讨论】:

      【解决方案4】:

      你的`异常说...

      java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String
      

      大胆地表明,您正在尝试将 URL 转换为 String 对象...这意味着,baseURLURL 对象,但您正尝试将其转换为 String 对象,这就是Exception 发生的原因。

      现在,更改以下内容...

      String baseURL;
      

      Uri baseURL;
      

      此外,如果您将 baseURL 引用为 String,请将它们更改为 Uri

      【讨论】:

        【解决方案5】:

        通过调用trim() 尝试删除 URL 中所有不必要的空格。 请同时参考以下问题

        Android: howto parse URL String with spaces to URI object?

        【讨论】:

        • 我已经在调用 asynctask 时使用了 trim(),但这并没有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多