private class DownloadLargeFileTask extends AsyncTask<Void, Void, Void>
{
private final ProgressDialog dialog;
public DownloadLargeFileTask(ProgressDialog dialog) {
this.dialog = dialog;
}
protected void onPreExecute() {
dialog.show();
}
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
@Override
protected Void doInBackground(Void... arg0) {
download();
return null;
}
}
private void download ()
{
try
{
long startTime = System.currentTimeMillis();
URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3"));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
int downloadedSize = 0;
while ( (len1 = in.read(buffer)) != -1 )
{
f.write(buffer,0, len1);
downloadedSize += len1;
ReturnDownloadedBytes(downloadedSize);
}
f.close();
Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
}
catch (IOException e)
{
Log.d("ImageManager", "Error" + ((System.currentTimeMillis()) / 1000) + e + " sec");
}
}
private void ReturnDownloadedBytes(int size)
{
text.setText(String.valueOf(size));
}
错误说:只有创建视图层次结构的原始线程才能触及其视图。 我认为这意味着我从一个therad创建textview并尝试从另一个(AsyncTask)访问但是如何获得它? 感谢
修改
这是所有代码。但是,即使我发送publishProgress(downloadedSize) int value = 10
,它也会以text.setText(String.valueOf(progress));
不同的值来监听输出,例如[Ljava.lang.float;@43ed62f78
public class list extends Activity {
private TextView text;
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.result);
}
public void selfDestruct(View view) {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage("????????. ?????...");
new DownloadLargeFileTask(dialog).execute();
}
private class DownloadLargeFileTask extends AsyncTask<Void, Integer, Void>
{
private final ProgressDialog dialog;
public DownloadLargeFileTask(ProgressDialog dialog) {
this.dialog = dialog;
}
protected void onPreExecute() {
dialog.show();
}
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
protected void onProgressUpdate(Integer...progress) {
text.setText(String.valueOf(progress));
}
@Override
protected Void doInBackground(Void... arg0) {
try
{
long startTime = System.currentTimeMillis();
URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3"));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
int downloadedSize = 10;
while ( (len1 = in.read(buffer)) != -1 )
{
f.write(buffer,0, len1);
//downloadedSize += len1;
**publishProgress(downloadedSize);**
}
f.close();
Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
}
catch (IOException e)
{
Log.d("ImageManager", "Error" + ((System.currentTimeMillis()) / 1000) + e + " sec");
}
return null;
}
}
答案 0 :(得分:2)
您可以通过将进度发布到UI线程来更改UI。从doInBackground调用publishProgress。这将在AsyncTask中调用onProgressUpdate,您可以在其中更新UI。
您必须在AsyncTask中定义onProgressUpdate。 http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress ...)
答案 1 :(得分:2)
您对错误的评估是正确的。我假设text
是TextView
中定义的Activity
对象,因此它是在UI线程中创建的。在doInBackground()
内运行的代码在单独的线程中运行。只有UI线程可以对UI元素执行更新,因此当您尝试调用setText
时,您会收到您报告的错误消息。
Abhinav在如何解决问题方面也是正确的,因为AsyncTask
有一个方法可以调用以从后台线程向UI线程发送更新:publishProgress
,它调用{{1} }}
将此方法添加到onProgressUpdate()
:
AsyncTask
并更改@Override
protected void onProgressUpdate(Integer... integer){
text.setText(integer[0].toString());
}
中的while
循环:
download()