У меня есть код, который успешно работает в Google Nexus (Android 4.2). Но когда я попробовал это вчера в более низкой версии с Android 2.3.5, он выдает исключение.
Пожалуйста, помогите мне решить то же самое.
Подробности.
Я создал класс DownloadHelper
, который помогает мне загрузить файл из Интернета в папку на моем телефоне. Этот стажер класса вызывает подкласс DownloadFile extends AsyncTask
. Когда я пытаюсь создать объект DownloadFile
, он выдает исключение.
Ниже приведен код DownloadHeper
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import org.andengine.entity.text.Text;
import org.andengine.ui.activity.BaseGameActivity;
import com.gretrainer.gretrainer.StartingScreen;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public class DownloadHelper {
public void loadFile(String url,Text loadingT,BaseGameActivity activity1,String _filename,int _tag){
DownloadFile downloadFile;
try {
downloadFile = new DownloadFile();
loadingText = loadingT;
activity = activity1;
downloadFile.execute(url);
StartingPercent = 0;
EndingPercent = 100;
filename = _filename;
tag = _tag;
} catch (Exception e) {
Log.d("exec",e.getLocalizedMessage());
}
}
private int tag;
private String filename;
private float StartingPercent;
private float EndingPercent;
private BaseGameActivity activity;
private Text loadingText;
private class DownloadFile extends AsyncTask<String,Integer,String>{
public DownloadFile(){
}
@Override
protected String doInBackground(String... sUrl) {
try {
URL url = new URL(sUrl[0]);
URLConnection connection = url.openConnection();
connection.connect();
// this will be useful so that you can show a typical 0-100% progress bar
int fileLength = connection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().toString().concat(File.separator + filename));
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
StartingScreen act = (StartingScreen)activity;
act.onLoadFileComplete(tag);
} catch (Exception e) {
String message = e.getLocalizedMessage();
Log.d("hello",message);
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
activity.runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});
//loadingText.setText(StartingPercent + ((EndingPercent - StartingPercent) / 100) * progress[0] + "%");
}
}
}
Исключение возникает при выполнении строки downloadFile = new DownloadFile();
Подробная информация об исключении показана ниже.
UpdateThread interrupted. Don't worry - this EngineDestroyedException is most likely expected!
org.andengine.engine.Engine$EngineDestroyedException
Он восходит к последней строке onCreateScene
. но приложение зависло. Он отлично работает в новой ОС Android (4.2)
пожалуйста, проверьте
Это всего лишь предположение, но некоторые из DownloadHelper
приводят к выводу, что вы неправильно выполняете DownloadFile extends AsyncTask
(см. DownloadFile
. Я не предлагаю вызывать DownloadHeper
самостоятельно, а выполнять
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import org.andengine.entity.text.Text;
import org.andengine.ui.activity.BaseGameActivity;
import com.gretrainer.gretrainer.StartingScreen;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public class DownloadHelper {
public void loadFile(String url,Text loadingT,BaseGameActivity activity1,String _filename,int _tag){
DownloadFile downloadFile;
try {
downloadFile = new DownloadFile();
loadingText = loadingT;
activity = activity1;
downloadFile.execute(url);
StartingPercent = 0;
EndingPercent = 100;
filename = _filename;
tag = _tag;
} catch (Exception e) {
Log.d("exec",e.getLocalizedMessage());
}
}
private int tag;
private String filename;
private float StartingPercent;
private float EndingPercent;
private BaseGameActivity activity;
private Text loadingText;
private class DownloadFile extends AsyncTask<String,Integer,String>{
public DownloadFile(){
}
@Override
protected String doInBackground(String... sUrl) {
try {
URL url = new URL(sUrl[0]);
URLConnection connection = url.openConnection();
connection.connect();
// this will be useful so that you can show a typical 0-100% progress bar
int fileLength = connection.getContentLength();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().toString().concat(File.separator + filename));
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
StartingScreen act = (StartingScreen)activity;
act.onLoadFileComplete(tag);
} catch (Exception e) {
String message = e.getLocalizedMessage();
Log.d("hello",message);
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
activity.runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
});
//loadingText.setText(StartingPercent + ((EndingPercent - StartingPercent) / 100) * progress[0] + "%");
}
}
}
в другом потоке. Поэтому вместо