1

这是我做网络操作的服务。但它抛出 NetworkonMainThreadException ,我理解 android 更高版本不允许在主线程下进行网络操作。现在我想为此目的使用异步任务。我不确定我需要在服务类的异步任务下添加哪些代码才能真正完成代码。以下是我的服务代码:

public class NewsTickerDataService extends Service {

 @Override
    public void onStart(Intent aIntent, int aStartId) {
        super.onStart(aIntent, aStartId);   
        RemoteViews _views = buildUpdatedViews(this);   
        ComponentName _widget = 
            new ComponentName(this, NewsTicker.class);
        AppWidgetManager _manager = 
            AppWidgetManager.getInstance(this); 
        _manager.updateAppWidget(_widget, _views);
    }

    @Override
    public IBinder onBind(Intent aParamIntent) {
        // not supporting binding   
        return null;
    }

    private RemoteViews buildUpdatedViews(Context aContext) {
        List<Story> _stories = getStories();
        RemoteViews _result = new RemoteViews(
            aContext.getPackageName(), 
            R.layout.activity_main
        );

        if (_stories.isEmpty()) {
            _result.setTextViewText(R.id.title, 
                "Sadly there's nothing to read today.");
        } else {
            _result.setTextViewText(
                R.id.title, _stories.get(0).getTitle());
        }
        return _result;
    }

    private List<Story> getStories() {
        try {
            URL _url = new URL("http://search.twitter.com" +
                "/search.atom?q=%23uml&" + 
                "result_type=mixed&count=5"
            );
            InputStream _in = _url.openStream();
            return parse(new InputSource(_in));
        } catch (Exception anExc) {
            Log.e("NewsTicker", anExc.getMessage(), anExc);
            return new ArrayList<Story>();
        }
    }

    private List<Story> parse(InputSource aSource)
    throws Exception {
        SAXParserFactory _f = SAXParserFactory.newInstance();
        SAXParser _p = _f.newSAXParser();
        XMLReader _r = _p.getXMLReader();

        AbstractParser _h = AbstractParser.newAtomParser();
        _r.setContentHandler(_h);   
        _r.parse(aSource);

        return _h.getStories();
    }

}

异步任务代码:

public class YourAsyncTask extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {
            // your load work
            //return myString;
        }

        @Override
        protected void onPostExecute(String result) {

        }

    }

有人可以帮我将异步任务集成到相同的代码中。谢谢

4

2 回答 2

0

是的,我也建议使用 IntentService!

意图服务示例

public class MyService extends IntentService {

private int STOP_DOWNLOAD = false;
public static int UPDATE_PROGRESS = 0;

public MyService() {
    super("myservice");
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
protected void onHandleIntent(Intent intent) {

    // Network Task : download ?

    // Send some data to the receiver
    Bundle resultData = new Bundle();
    resultData.putInt("progress", progress);
    receiver.send("update", resultData);
}

private void stopDownload() {
    this.STOP_DOWNLOAD = true;
    // Stop the download : use this boolean into onHandleIntent
}

}

收件人

public class MyReceiver extends ResultReceiver {

Context context;

public MyReceiver(Context mContext) {
    super(handler);
    context = mContext;
}

@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    super.onReceiveResult(resultCode, resultData);

    if (resultCode == "update") {


        String something = resultData.getString(MyService.SOMETHING);

    }
}

}

在 Activity 中启动服务:startService(...)

于 2013-09-23T14:41:23.427 回答
0

从您的服务类的 onStart() 进行网络操作

        YourAsyncTask.execute(url);

异步任务代码

    public class YourAsyncTask extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // your load work
        DefaultHttpClient client = new DefaultHttpClient();
         HttpGet httpGet = new HttpGet(url);
    try {
      HttpResponse execute = client.execute(httpGet);
      InputStream content = execute.getEntity().getContent();

      BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
      String s = "";
      while ((s = buffer.readLine()) != null) {
        response += s;
      }

    } catch (Exception e) {
      e.printStackTrace();
    }



  return response;
        //return myString;
    }

    @Override
    protected void onPostExecute(String result) {
       //HERE CALL YOUR PARSE METHOD

       //AFTER PARSING CALL buildUpdatedViews(Context aContext , stories)
    }

}
于 2013-09-24T12:03:00.283 回答