Java 具有服务器连接的异步任务

Java 具有服务器连接的异步任务,java,android,Java,Android,大家好,我有这个问题,我必须做一个AsyncTask,因为从IceCast连接到服务时出错NetworkOnMainThreadException。然后,当我四处阅读时,我说您放一个AsyncTask来解决这个问题,或者授予权限 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 但在任何情况

大家好,我有这个问题,我必须做一个AsyncTask,因为从IceCast连接到服务时出错NetworkOnMainThreadException。然后,当我四处阅读时,我说您放一个AsyncTask来解决这个问题,或者授予权限

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
但在任何情况下都不起作用,而且它会使我的应用程序崩溃,甚至没有告诉我一些错误,尽管有try-catch。。 你能给我解释一下吗

提前感谢以下是代码:

import java.io.IOException; 
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import net.moraleboost.streamscraper.ScrapeException;
import net.moraleboost.streamscraper.Scraper;
import net.moraleboost.streamscraper.Stream;    
import net.moraleboost.streamscraper.scraper.IceCastScraper;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;


public class SwipeyTabsSampleActivity extends FragmentActivity {
    private Button streamButton;

    private ImageButton playButton;

    private TextView textStreamed;
    private TextView textSong;

    private boolean isPlaying;

    private StreamingMediaPlayer audioStreamer;

    private static final String [] TITLES = {
            "Live Stream",
            "Palinsesto",
            "Programmi",
            "Eventi",
    };

    private SwipeyTabs mTabs;
    private ViewPager mViewPager;


    @Override
    public void onCreate(Bundle savedInstanceState) {


            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_swipeytab);

            mViewPager = (ViewPager) findViewById(R.id.viewpager);
            mTabs = (SwipeyTabs) findViewById(R.id.swipeytabs);

            SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(this,
                            getSupportFragmentManager());
            mViewPager.setAdapter(adapter);
            mTabs.setAdapter(adapter);
            mViewPager.setOnPageChangeListener(mTabs);
            mViewPager.setCurrentItem(0);

            Inizializza();

            new AsyncTaskProc().execute();

    }

    private void startStreamingAudio() {
            try { 
                    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
                    if ( audioStreamer != null) {
                            audioStreamer.interrupt();
                    }


                    audioStreamer = new StreamingMediaPlayer(this, textStreamed, playButton, streamButton,progressBar);
                    audioStreamer.startStreaming("http://r35798.ovh.net:8000/listen",1677, 214);
                    streamButton.setEnabled(false);
            } catch (IOException e) {                       
            }

    }
    private void Inizializza()
    {
            textStreamed = (TextView) findViewById(R.id.text_kb_streamed);
            streamButton = (Button) findViewById(R.id.button_stream);
            streamButton.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View view) {
                            startStreamingAudio();
                    }});


            playButton = (ImageButton) findViewById(R.id.button_play);
            playButton.setEnabled(false);
            playButton.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View view) {
                            if (audioStreamer.getMediaPlayer().isPlaying()) {
                                    audioStreamer.getMediaPlayer().pause();
                                    playButton.setImageResource(R.drawable.button_play);
                            } else {
                                    audioStreamer.getMediaPlayer().start();

                                    audioStreamer.startPlayProgressUpdater();
                                    playButton.setImageResource(R.drawable.button_pause);
                            }
                            isPlaying = !isPlaying;
                    }});
    }
    private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements
    SwipeyTabsAdapter {

            private final Context mContext;

            public SwipeyTabsPagerAdapter(Context context, FragmentManager fm) {
                    super(fm);

                    this.mContext = context;
            }

            @Override
            public Fragment getItem(int position) {
                    return SwipeyTabFragment.newInstance(TITLES[position]);
            }

            @Override
            public int getCount() {
                    return TITLES.length;
            }

            public TextView getTab(final int position, SwipeyTabs root) {
                    TextView view = (TextView) LayoutInflater.from(mContext).inflate(
                                    R.layout.swipey_tab_indicator, root, false);
                    view.setText(TITLES[position]);
                    view.setOnClickListener(new OnClickListener() {
                            public void onClick(View v) {
                                    mViewPager.setCurrentItem(position);
                            }
                    });

                    return view;
            }

    }


    public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

    }

    public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

    }

    public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub

    }
    //////////////////////////////////////

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            menu.add("Uscita").setOnMenuItemClickListener(
                            new OnMenuItemClickListener() {
                                    public boolean onMenuItemClick(MenuItem item) {
                                            Toast.makeText(getApplicationContext(),
                                                            "Uscita Programma", Toast.LENGTH_SHORT).show();
                                            finish();
                                            System.exit(0);

                                            return true;
                                    }
                            });
            ;


            return true;
    }


    class AsyncTaskProc extends AsyncTask<Void, String, Void> {
            @Override
            protected Void doInBackground(Void... unused) {


                    List<Stream> streams=null;
                    Scraper scraper = new IceCastScraper();

                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);

                    try {
                            streams = scraper.scrape(new URI("@@@@@@"));
                    } catch (ScrapeException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                            //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();
                    } catch (URISyntaxException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                            //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();
                    }


                    textSong =(TextView) findViewById(R.id.textViewCurrentSong);

                    try {
                            for (Stream stream: streams) {

                                    textSong.setText((stream.getCurrentSong()));
                            }
                    } catch (Exception e) {
                            //Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();

                    }


                    return (null);
            }


    }
}
编辑:我现在在OnPostExecute中移动Ui这是新的logcat

010-30 21:22:03.535: E/Trace(4973): error opening trace file: No such file or directory (2)
10-30 21:22:05.145: E/AndroidRuntime(4973): FATAL EXCEPTION: AsyncTask #1
10-30 21:22:05.145: E/AndroidRuntime(4973): java.lang.RuntimeException: An error occured while executing doInBackground()
10-30 21:22:05.145: E/AndroidRuntime(4973):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.lang.Thread.run(Thread.java:856)
10-30 21:22:05.145: E/AndroidRuntime(4973): Caused by: java.lang.Error: Unresolved compilation problem: 
10-30 21:22:05.145: E/AndroidRuntime(4973):     org.apache.commons.logging.LogFactory cannot be resolved to a type
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.LoggerFactory.determineDefaultLoggerProvider(LoggerFactory.java:51)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.LoggerFactory.getDefaultLoggerProvider(LoggerFactory.java:39)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.LoggerFactory.getLoggerProvider(LoggerFactory.java:35)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.LoggerFactory.getLogger(LoggerFactory.java:27)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.Source.newLogger(Source.java:1645)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.htmlparser.jericho.Source.<init>(Source.java:109)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.moraleboost.streamscraper.parser.IceCastParser.parse(IceCastParser.java:67)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at net.moraleboost.streamscraper.scraper.IceCastScraper.scrape(IceCastScraper.java:65)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at com.uniradio.cesena.app.SwipeyTabsSampleActivity$AsyncTaskProc.doInBackground(SwipeyTabsSampleActivity.java:264)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at com.uniradio.cesena.app.SwipeyTabsSampleActivity$AsyncTaskProc.doInBackground(SwipeyTabsSampleActivity.java:1)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-30 21:22:05.145: E/AndroidRuntime(4973):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-30 21:22:05.145: E/AndroidRuntime(4973):     ... 5 more

你没有提供你的logcat错误,所以我猜,但我认为问题如下

您正试图从doInBackground中操纵UI,这将导致您的应用程序崩溃。将AsyncTask必须执行的对UI的任何更改移动到onPostExecute中

例如:

textSong.setText((stream.getCurrentSong()));
-将UI工作保持在UI线程上,非UI工作保持在非UI线程上是一种很好的做法,但从Android上的蜂巢版本开始,这就成为了一项法律

-Android应用程序启动于主线程,即DUI专用UI线程

-您应该在非UI线程上保留非UI处理器密集型工作

-使用带处理程序的线程来完成,或者使用巧尽心思构建的AsyncTask,这在Android中也称为无痛线程

现在,您的问题是:

-doInBackground是用于处理非UI部分的方法,您正在执行textSong.setTextstream.getCurrentSong;就其本身而言。这是导致应用程序崩溃的主要原因


-使用onPostExecute方法来执行UI工作,因此保留此方法中的文本设置。

谢谢,我这样做是为了在onPostExecute{textSong=TextView findViewByIdR.id.textViewCurrentSong;尝试{for Stream Stream:streams{textSong.setTextstream.getCurrentSong;}捕获异常e{//Toast.makeTextgetApplicationContext,e.toString,Toast.LENGTH_SHORT.show;}但在以下位置崩溃:streams=scraper.scrapnew URI@@@@;处理程序不工作谢谢,我这样做是在PostExecute上保护void{textSong=TextView findViewByIdR.id.textViewCurrentSong;尝试{for Stream Stream:streams{textSong.setTextstream.getCurrentSong;}捕获异常e{//Toast.makeTextgetApplicationContext,e.toString,Toast.LENGTH\u SHORT.show;}},但在以下位置崩溃:streams=scraper.scrapew URI@@@;处理程序不工作