2012-10-26 52 views
0

我需要下載100MB的圖像,所以我決定最好的方法是使服務下載它,並將顯示活動中每個文件的結果。但是這個工作方式就像沒有服務,活動,只有在下載所有文件後才解凍。更新活動從服務TextView

繼承人活動的代碼:

服務
public class DownloadActivity extends Activity 
{ 
String hist; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.download_activity); 

    startService(new Intent(this, DownloadService.class)); 
    registerReceiver(broadcastReceiver, 
      new IntentFilter(DownloadService.BROADCAST_ACTION)); 
} 

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent _intent) 
    { 
     updateUI(_intent);  
    } 
}; 

private void updateUI(Intent intent) 
{ 
    if (intent.getBooleanExtra("exists", false)) 
     hist = hist + "Item " + 
       intent.getIntExtra("item", -1) + ", image " + 
       intent.getIntExtra("obraz", -1) + " - DOWNLOADED\n"; 
    else 
     hist = hist + "Item " + 
       intent.getIntExtra("item", -1) + ", image " + 
       intent.getIntExtra("obraz", -1) + " - ALREADY EXISTS\n"; 

    ((TextView) findViewById(R.id.dtitle)).setText("Item " + 
      intent.getIntExtra("item", -1) + ", image " + 
        intent.getIntExtra("image", -1) + "."); 

    ((TextView) findViewById(R.id.ddetails)).setText(hist); 
} 
} 

代碼:

public class DownloadService extends Service 
{ 
public static final String BROADCAST_ACTION = "emis.katalog.grzybow.publishprogress"; 
Intent intent; 
int counter = 0; 
String postString; 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    intent = new Intent(BROADCAST_ACTION); 
} 

@Override 
public void onStart(Intent intent, int startId) 
{ 
    SQLiteDatabase db = new BazaGrzybowHelper(DownloadService.this).getReadableDatabase(); 
    Cursor kursor = db.rawQuery("SELECT * FROM table", null); 

    InputStream in = null; 
    OutputStream out = null; 
    URL ulrn; 

    int nn = 1; 
    int pos = 1; 

    //out: 
     while(kursor.moveToNext()) 
     { 
      while(kursor.getString(kursor.getColumnIndex("i_url_" + nn)) != "" || 
        kursor.getString(kursor.getColumnIndex("i_url_" + nn)) != null) 
      { 
       String filename = "thg_" + pos + "_" + (nn+2) + ".jpg"; 
       if (new File(Environment.getExternalStorageDirectory(), 
         "emis/katalog.grzybow/zapis_na_stale/"+filename).exists()) 
        publishProgress(pos, nn, true); 
       else 
       { 
        publishProgress(pos, nn, false); 


        File destDir = new File(Environment.getExternalStorageDirectory(), 
          "emis/katalog.grzybow/zapis_na_stale"); 
        if (!destDir.exists()) 
         destDir.mkdirs(); 
        destDir = null; 

        try 
        { 
         ulrn = new URL(kursor.getString(kursor.getColumnIndex("i_url_" + nn))); 
         HttpURLConnection con = (HttpURLConnection)ulrn.openConnection(); 
         in = con.getInputStream(); 
         out = new FileOutputStream(Environment.getExternalStorageDirectory(). 
           getPath() + "/emis/katalog.grzybow/zapis_na_stale/" + filename); 
         copyFile(in, out); 
         in.close(); 
         in = null; 
         out.flush(); 
         out.close(); 
         out = null; 
        } 
        catch(Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 
       nn++; 

       if (nn > 10 || kursor.getString(kursor.getColumnIndex("i_url_" + nn)) == "" || 
         kursor.getString(kursor.getColumnIndex("i_url_" + nn)) == null) 
       { 
        nn = 1; 
        break; 
       } 
       /*if (anuluj) 
        break out;*/ 
      } 
      pos++; 
     } 

    db.close(); 
} 

private void publishProgress(int item, int image, boolean exists) 
{ 
    intent.putExtra("item", item); 
    intent.putExtra("image", image); 
    intent.putExtra("exists", exists); 
    sendBroadcast(intent); 
} 

private void copyFile(InputStream in, OutputStream out) throws IOException 
{ 
    byte[] buffer = new byte[1024]; 
    int read; 
    while((read = in.read(buffer)) != -1) 
    { 
     out.write(buffer, 0, read); 
    } 
} 

} 

我在做什麼錯?

回答

3

也許this

注意:一種服務,它的託管過程中 服務不會創建自己的線程的主線程中運行,在單獨的 過程中不運行(除非另行指定)。這意味着,如果您的服務將執行任何CPU密集型工作或阻止操作(如MP3播放或聯網) ,則應在服務內創建一個新線程 以完成此項工作。通過使用單獨的線程,您可以降低應用程序不響應(ANR)錯誤的風險,並且應用程序的主線程可以保持專用於用戶與您的活動的交互 。

+0

謝謝!這解釋了一切:) – user1555754