2013-08-26 42 views
0

所以我提出一个应用程序,我只是初学者,但我坚持,我有这样的代码:OnMainThreadException错误,但主线程上没有执行网络操作?

public class MenuChoice extends Activity { 
    InputStream string = null; 
    ArrayList<String> Deals = null; 
    ArrayList<String> ImageBase; 
    int currentDeal = 0; 

    public void StreamReader() throws IOException{ 
     InputStreamReader is = new InputStreamReader(string); 
     StringBuilder sb=new StringBuilder(); 
     BufferedReader br = new BufferedReader(is); 
     String read = br.readLine(); 

     while(read != null) { 
      //System.out.println(read); 
      sb.append(read); 
      read =br.readLine(); 

     } 
     String[] DealList = sb.toString().split("±"); 
     //ArrayList<String> deals = new ArrayList<String>(); 
     for(int i = 0; i < DealList.length; i++){ 
      Log.d("msgs", DealList[i]); 
      if(DealList[i].length() > 5){ 
       Deals.add(DealList[i]); 
      } 
     } 
//  return deals; 
    } 
    public String DownloadImg(String urla, String newname){ 
     String fileName = null; 
     try{ 
     URL url = new URL (urla); 
     InputStream input = url.openStream(); 
     try { 
     //The sdcard directory e.g. '/sdcard' can be used directly, or 
     //more safely abstracted with getExternalStorageDirectory() 
     File storagePath = Environment.getExternalStorageDirectory(); 
     OutputStream output = new FileOutputStream (storagePath + "/" + newname + "/.png"); 
     fileName = storagePath + "/" + newname + "/.png"; 
     try { 
      byte[] buffer = new byte[5000]; 
      int bytesRead = 0; 
      while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { 
       output.write(buffer, 0, bytesRead); 
      } 
     } finally { 
      output.close(); 
     } 
     } finally { 
     input.close(); 
     } 
     } 
     catch(Exception e){ 
     } 

     return fileName; 
    } 
    public void SetInp(InputStream inp){ 
     string = inp; 
    } 

    public class GetDeals extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      InputStream str = null; 
      HttpClient htc = new DefaultHttpClient(); 
      HttpPost htp = new HttpPost("site/android_connect.php"); 
       try { 
        HttpEntity resp = htc.execute(htp).getEntity(); 
        InputStream strings = resp.getContent(); 
        str = strings; 
       } catch (ClientProtocolException e) { 
        Log.d("problema" ,"BAD!"); 
        e.printStackTrace(); 
       } catch (IOException e) { 
        Log.d("problema" ,"BAD!"); 
        e.printStackTrace(); 
       } 
      string = str; 
      return null; 

    } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_menu_choice); 

     try { 
      new GetDeals().execute().get(); 
     } 
     catch(Exception e){} 
     /* try { 
      Deals = StreamReader(string); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     /* 
     for(int i = 0; i<Deals.size(); i++){ 

      ImageBase.add(DownloadImg(Deals.get(i), "Deal"+i)); 
      Log.d("bugger", DownloadImg(Deals.get(i), "Deal"+i)); 
     } 
     */ 
     try { 
      StreamReader(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_choice, menu); 
     return true; 
    } 

} 

所以我得到这个错误抛出:

08-26 17:42 :52.030:E/AndroidRuntime(10221):致命例外:main 08-26 17:42:52.030:E/AndroidRuntime(10221): java.lang.RuntimeException:无法启动活动 ComponentInfo {plugMedia.kcrarea/plugMedia .kcrarea.MenuChoice}: android.os.NetworkOnMainThreadException 08-26 17:42:52.030: E/AndroidRuntime(10221):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 08-26 17:42:52.030:E/AndroidRuntime(10221):at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1981) 08-26 17:42:52.030:E/AndroidRuntime(10221):at android.app.ActivityThread.access $ 600(ActivityThread.java:123)08-26 17:42:52.030 :E/AndroidRuntime(10221):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147) 08-26 17:42:52.030:E/AndroidRuntime(10221):at android.os.Handler .dispatchMessage(Handler.java:99)08-26 17:42:52.030:E/AndroidRuntime(10221):at android.os.Looper.loop(Looper.java:137 )08-26 17:42:52.030: E/AndroidRuntime(10221):at android.app.ActivityThread.main(ActivityThread.java:4424)08-26 17:42:52.030:E/AndroidRuntime(10221) :at java.lang.reflect.Method.invokeNative(Native Method)08-26 17:42:52.030:E/AndroidRuntime(10221):at java.lang.reflect.Method.invoke(Method.java:511 )08-26 17:42:52.030: E/AndroidRuntime(10221):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:787) 08-26 17:42:52.030: E/AndroidRuntime(10221):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)08-26 17:42:52.030:E/AndroidRuntime(10221):at dalvik.system。 NativeStart .main(Native Method)08-26 17:42:52.030: E/AndroidRuntime(10221):造成者: android.os.NetworkOnMainThreadException 08-26 17:42:52.030: E/AndroidRuntime(10221):at android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 08-26 17:42:52.030:E/AndroidRuntime(10221):at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) E/AndroidRuntime(10221):08-26 17:42:52.030:E/AndroidRuntime(10221):at libcore.io.IoBridge.recvfrom(IoBridge.java:503)08-26 17:42:52.030: E/at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)08-26 17:42:52.030:E/AndroidRuntime(10221):at java.net.PlainSocketI mpl.access $ 000(PlainSocketImpl.java:46)08-26 17:42:52.030:E/AndroidRuntime(10221):at java.net.PlainSocketImpl $ PlainSocketInputStream.read(PlainSocketImpl.java:240) 08-26 17:42:52.030:E/AndroidRuntime(10221):at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 08-26 17:42:52.030:E/AndroidRuntime(10221) ):at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:120) 08-26 17:42:52.030:E/AndroidRuntime(10221):at org.apache.http.impl .io.ChunkedInputStream.getChunkSize(ChunkedInputStream。java:211) 08-26 17:42:52.030:E/AndroidRuntime(10221):at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:183) 08-26 17:42 :52.030:E/AndroidRuntime(10221):at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:155) 08-26 17:42:52.030:E/AndroidRuntime(10221):at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159) 08-26 17:42:52.030:E/AndroidRuntime(10221):at java.io.InputStreamReader.read(InputStreamReader.java: 244)08-26 17:42:52.030:E/AndroidRuntime(10221):at java.io.BufferedReader.fillBuf(BufferedReader.java:130)08-26 17:42:52.030:E/AndroidRuntime(10221 ): 一个t java.io.BufferedReader.readLine(BufferedReader.java:390)08-26 17:42:52.030:E/AndroidRuntime(10221):at plugMedia.kcrarea.MenuChoice.StreamReader(MenuChoice.java:59)08 -26 17:42:52.030:E/AndroidRuntime(10221):at plugMedia.kcrarea.MenuChoice.onCreate(MenuChoice.java:158)08-26 17:42:52.030:E/AndroidRuntime(10221):at android.app.Activity.performCreate(Activity.java:4465)08-26 17:42:52.030:E/AndroidRuntime(10221):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 08 -26 17:42:52.030:E/AndroidRuntime(10221):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 08-26 17:42:52.030:E/AndroidRuntime(10221):...... 11多个

我理解它是说,我想执行的主线程网络行为,但所有我做的是调用StreamReader,我假设它只是转换InputStream(保存并从AsyncTask中检索,但它会引发错误。

任何帮助?是什么造成的?

谢谢。

+0

你正在做主要UI线程的NetworkRelated操作,这是不可能的后蜂窝。 您可以使用'threads'或asynctask – Raghunandan

+0

Raghunandan - 我正在运行什么网络相关操作?我以为我唯一的NetworkRelated操作是在AsyncTask中,而在其他地方? –

+0

此外,我也有许可证添加在清单中的INTERNET访问 –

回答

1

但是,如果我删除.get()它不会将InputSream string = null设置为从链接获取的InputStream。

移动你的InputStream及其结果(例如,您的通话StreamReader())的使用到AsyncTaskonPostExecute(),并删除调用get()。 Raghunandan指出,get()基本上意味着在AsyncTask首先没有意义,这就是为什么我有an outstanding feature request to get a Lint warning added for this

+0

谢谢CommonsWare,我想开始学习更多关于AsyncTask的知识,然后解决我的问题。 –

+0

哇wtf,我从来没有见过'.get()'以前。根据Android文档,'AsyncTask'应该能够实现“轻松线程化”。当我第一次阅读线程时,我绝对不会知道'get()'的含义......可怕的可怕设计 –

相关问题