2014-04-22 29 views
0

如何將以下文本置於AsyncTask?我的問題是,通過直接放置代碼,我得到一個錯誤NetworkOnMainThreadException。我需要任何幫助。由於Android:將網址代碼放入AsyncTask

try { 
    URL myFileUrl = new URL ("http://.../cercanias.png"); 
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
    conn.setDoInput(true); 
    conn.connect(); 

    InputStream is = conn.getInputStream(); 
    Bitmap bm = BitmapFactory.decodeStream(is); 

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png"); 
    bm.compress(Bitmap.CompressFormat.PNG, 90, out); 

    SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida); 

    imageView.setImageFile(getCacheDir() + "cercanias.png"); 

    out.close(); 

    if (savedInstanceState != null && 
      savedInstanceState.containsKey(STATE_SCALE) && 
      savedInstanceState.containsKey(STATE_CENTER_X) && 
      savedInstanceState.containsKey(STATE_CENTER_Y)) { 

     imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
       new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
         savedInstanceState.getFloat(STATE_CENTER_Y))); 
    } 
} catch (IOException e) { 
} 
+0

把它放在doInBackground? – Skynet

回答

2
class TestAsyncTask extends AsyncTask<String, Integer, Integer> { 

    protected Integer doInBackground(String... strings) { 
    // Long running task - say processing of each passed string 

    URL myFileUrl = new URL ("http://.../cercanias.png"); 
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
    conn.setDoInput(true); 
    conn.connect(); 

    InputStream is = conn.getInputStream(); 
    Bitmap bm = BitmapFactory.decodeStream(is); 

     FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png"); 
    bm.compress(Bitmap.CompressFormat.PNG, 90, out); 
    out.close(); 
    return 0; 
} 


protected void onPostExecute(Integer result){ 
    Log.d("TestP", "AsyncTask returned : " + result); 
SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida); 

imageView.setImageFile(getCacheDir() + "cercanias.png"); 


if (savedInstanceState != null && 
     savedInstanceState.containsKey(STATE_SCALE) && 
     savedInstanceState.containsKey(STATE_CENTER_X) && 
     savedInstanceState.containsKey(STATE_CENTER_Y)) { 

    imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
      new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
        savedInstanceState.getFloat(STATE_CENTER_Y))); 
} 
} 
+0

和savedInstanceState? savedInstanceState是我的活動 – Charlie

0

在這裏你去:有三個步驟到的AsyncTask,preExecute(),postExecute()和doInBackground。名字是自我解釋的。 preExecute()表示執行前必須完成的所有操作,postExecute表示執行後的所有內容,doInBackground表示耗時的進程。

簡單的例子:

public class HeavyProcess extends AsyncTask<Void, Void, Void> { 
     ProgressDialog Asycdialog = new ProgressDialog(getActivity()); 

     protected void onPostExecute(String result) { 

      //After execution execute this 
      super.onPostExecute(result); 
     } 

     @Override 
     protected void onPreExecute() { 
      //Before execution do this, like init a progress dialog 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(Void... params) { 
      //Do the time consuming work here 
      return ""; 
     } 
    } 
現在

你的情況:創建所有代碼的函數:

public void timeTask(){ 

try { 
    URL myFileUrl = new URL ("put your URL here"); 
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
    conn.setDoInput(true); 
    conn.connect(); 

    InputStream is = conn.getInputStream(); 
    Bitmap bm = BitmapFactory.decodeStream(is); 

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png"); 
    bm.compress(Bitmap.CompressFormat.PNG, 90, out); 

    SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(R.id.imagenNitida); 

    imageView.setImageFile(getCacheDir() + "cercanias.png"); 

    out.close(); 


    } 
} catch (IOException e) { 
} 

} 

然後調用從doInBackground的timeTask()()函數;

+0

和savedInstanceState? savedInstanceState是我的活動捆綁 – Charlie

+0

這進入onCreate(),或在postExecute,這是最好的,我的壞!確保你在doInBackground中不做任何I/O。這將會崩潰。 – Skynet

+0

是的,這段代碼是onCreate() – Charlie

0

做這樣

new AsyncTask<Void, Void, String>() { 

      @Override 
      protected String doInBackground(Void... arg0) { 

       try { 
        URL myFileUrl = new URL("http://.../cercanias.png"); 
        HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
        conn.setDoInput(true); 
        conn.connect(); 

        InputStream is = conn.getInputStream(); 
        Bitmap bm = BitmapFactory.decodeStream(is); 

        FileOutputStream out = new FileOutputStream(getCacheDir() +File.separator+ "cercanias.png"); 
        bm.compress(Bitmap.CompressFormat.PNG, 90, out); 
        out.close(); 
        conn.disconnect(); 
        bm.recycle(); 

        return "cercanias.png"; 

       } catch (IOException e) { 
       } 
       return null; 
      } 

      protected void onPostExecute(String result) { 
       if (result != null) { 
        SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) findViewById(R.id.imagenNitida); 

        imageView.setImageFile(getCacheDir() +File.separator+ result); 

        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_SCALE) && savedInstanceState.containsKey(STATE_CENTER_X) 
          && savedInstanceState.containsKey(STATE_CENTER_Y)) { 

         imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
           new PointF(savedInstanceState.getFloat(STATE_CENTER_X), savedInstanceState.getFloat(STATE_CENTER_Y))); 
        } 
       } 
      }; 
     }.execute(); 
+0

和savedInstanceState的捆綁包? savedInstanceState是我的活動 – Charlie

0

你就只需要打破這種代碼分成部分和適合他們到的AsyncTask:

public class checkGB_status_Async extends AsyncTask<Void, Void, Bitmap> { 

@Override 
protected Bitmap doInBackground(Void... params) { 
try { 
    URL myFileUrl = new URL ("http://.../cercanias.png"); 
    HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
    conn.setDoInput(true); 
    conn.connect(); 

    InputStream is = conn.getInputStream(); 
    Bitmap bm = BitmapFactory.decodeStream(is); 

    return bm; 
} catch (IOException e) { 
} 
} 

protected void onPostExecute(Bitmap result) { 

    FileOutputStream out = new FileOutputStream(getCacheDir() + "cercanias.png"); 
    result.compress(Bitmap.CompressFormat.PNG, 90, out); 

    SubsamplingScaleImageView imageView =  (SubsamplingScaleImageView)findViewById(R.id.imagenNitida); 

    imageView.setImageFile(getCacheDir() + "cercanias.png"); 

    out.close(); 

    if (savedInstanceState != null && 
      savedInstanceState.containsKey(STATE_SCALE) && 
      savedInstanceState.containsKey(STATE_CENTER_X) && 
      savedInstanceState.containsKey(STATE_CENTER_Y)) { 

    imageView.setScaleAndCenter(savedInstanceState.getFloat(STATE_SCALE), 
      new PointF(savedInstanceState.getFloat(STATE_CENTER_X), 
        savedInstanceState.getFloat(STATE_CENTER_Y))); 
} 
} 
+0

和savedInstanceState的捆綁? savedInstanceState是我的活動捆綁 – Charlie