Android:异步任务和读取互联网数据
我写了一个代码从互联网上下载一些数据。而不是我想把它放到一个任务中。然后下载就停止了。看起来它无法完成try{}部分,因此跳到exeption 我从主活动“Nekaj”调用loadData()类,它扩展了AsyncData。从那里我在try命令中调用“oto”类。“oto”类用于从internet读取内容并返回字符串数组。当我直接从“Nekaj”类调用oto类时,这就起作用了。使用AsyncTask时我做错了什么? 代码如下:Android:异步任务和读取互联网数据,android,android-asynctask,Android,Android Asynctask,我写了一个代码从互联网上下载一些数据。而不是我想把它放到一个任务中。然后下载就停止了。看起来它无法完成try{}部分,因此跳到exeption 我从主活动“Nekaj”调用loadData()类,它扩展了AsyncData。从那里我在try命令中调用“oto”类。“oto”类用于从internet读取内容并返回字符串数组。当我直接从“Nekaj”类调用oto类时,这就起作用了。使用AsyncTask时我做错了什么? 代码如下: public class Nekaj extends Act
public class Nekaj extends Activity {
TextView Tkolo, Tbroj1;
String[] brojevi_varijabla;
String privremena_varijabla = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.bez_provjere_739);
Tkolo = (TextView) findViewById(R.id.Xkolo);
Tbroj1 = (TextView) findViewById(R.id.Xbroj1);
/*
* try { privremena_varijabla = test.kolo_739();
* Tkolo.setText(privremena_varijabla); } catch (Exception e) { // TODO
* Auto-generated catch block e.printStackTrace(); }
*/
new loadData().execute();
}
public class loadData extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
Oto test = new Oto();
try {
brojevi_varijabla = test.brojevi_739();
if (Integer.valueOf(brojevi_varijabla[0]) > 10) {
Tbroj1.setText("" + brojevi_varijabla[0]);
} else {
Tbroj1.setText(" " + brojevi_varijabla[0]);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
public class Oto {
public String[] brojevi_739() throws Exception {
int i = 0;
int uvjet = 0;
int varijabla = 0;
char[] znak = { '>', '<' };
BufferedReader in = null;
String data[] = null;
String provjera = "date-info";
int[] polje = new int[2];
try {
HttpClient klijent = new DefaultHttpClient();
URI webstranica = new URI(
"https://www.aaa.bb");
HttpGet zahtjev = new HttpGet();
zahtjev.setURI(webstranica);
HttpResponse odgovor = klijent.execute(zahtjev);
in = new BufferedReader(new InputStreamReader(odgovor
.getEntity().getContent()));
StringBuffer brojevi = new StringBuffer("");
String brojevi_string = null;
String neki_string = null;
String red = "";
in.skip(21000);
while ((red = in.readLine()) != null) {
varijabla = red.indexOf(provjera);
if (varijabla != -1) {
// 1. KOLO
if (uvjet == 0) { // onda sadrži taj
// substring
// !!!!
red = in.readLine(); // sada string red sadrži ono
// što
// želim, još moram samo to
// izrezati!!
do {
if (i == 0) {
varijabla = red.indexOf(znak[i]);
}
else {
varijabla = red.indexOf(znak[i], polje[0]);
}
if (varijabla != -1) // ako taj znak postoji u
// stringu
{
if (i == 0) {
polje[i] = varijabla + 1;
}
else {
polje[i] = varijabla;
}
i++;
}
} while (i <= 1);
neki_string = red.substring(polje[0], polje[1]);
Tkolo.setText(neki_string);
provjera = "Dobitna kombinacija";
uvjet++;
continue;
}
}
}
in.close();
brojevi_string = brojevi.toString();
data = brojevi_string.split("\n");
return data;
} finally {
if (in != null) {
try {
in.close();
return data;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}}
公共类Nekaj扩展活动{
TextView Tkolo,Tbroj1;
字符串[]brojevi_varijabla;
字符串priveremana_varijabla=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.bez_provjere_739);
Tkolo=(TextView)findViewById(R.id.Xkolo);
Tbroj1=(文本视图)findViewById(R.id.Xbroj1);
/*
*试试{priveremana_varijabla=test.kolo_739();
*Tkolo.setText(priveremana_varijabla)}catch(异常e){//TODO
*自动生成的捕获块e.printStackTrace();}
*/
新建loadData().execute();
}
公共类loadData扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
Oto测试=新的Oto();
试一试{
brojevi_varijabla=test.brojevi_739();
if(整数值of(brojevi_varijabla[0])>10){
Tbroj1.setText(“+brojevi_varijabla[0]);
}否则{
Tbroj1.setText(“+brojevi_varijabla[0]);
}
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
}
公共级Oto{
公共字符串[]brojevi_739()引发异常{
int i=0;
int uvjet=0;
int-varijabla=0;
char[]znak={'>','使用onPostExecute(Void result1){}
要捕获结果并执行那里所需的操作,实际上,您正在尝试在异步任务的doInBackGround()
中更新UI,因此这是不允许的(doInBack..在非UI线程中运行),所以将UI更新代码放在异步任务的onPostExecute()
中
试试这个,让我知道发生了什么
public class loadData extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
Oto test = new Oto();
try {
brojevi_varijabla = test.brojevi_739();
if(brojevi_varijabla != null)
return brojevi_varijabla[0];
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result)
{
if(result != null)
{
if (Integer.valueOf(result) > 10) {
Tbroj1.setText("" + result;
} else {
Tbroj1.setText(" " + result);
}
}
}
}
公共类loadData扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
Oto测试=新的Oto();
试一试{
brojevi_varijabla=test.brojevi_739();
if(brojevi_varijabla!=null)
返回brojevi_varijabla[0];
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
如果(结果!=null)
{
if(整数值of(结果)>10){
Tbroj1.setText(“”+结果;
}否则{
Tbroj1.setText(“+结果);
}
}
}
}
您不能直接在非UI(后台)线程上操作UI元素,而非UI(后台)线程总是运行doInBackground()
。使用AsyncTask
的通常方法是在doInBackground()
中获取数据,将其作为值返回,然后在onPostExecute()
中处理UI更改。例如:
public class loadData extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... arg0) {
Oto test = new Oto();
try {
brojevi_varijabla = test.brojevi_739();
if (Integer.valueOf(brojevi_varijabla[0]) > 10) {
return "" + brojevi_varijabla[0];
} else {
return " " + brojevi_varijabla[0];
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (result != null) Tbroj1.setText(result);
}
公共类loadData扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
Oto测试=新的Oto();
试一试{
brojevi_varijabla=test.brojevi_739();
if(整数值of(brojevi_varijabla[0])>10){
返回“+brojevi_varijabla[0];
}否则{
返回“+brojevi_varijabla[0];
}
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
如果(结果!=null)Tbroj1.SETEXT(结果);
}
}您做错的是doInBackground()方法中的Tbroj1.setText()。您需要做的是使用onPostExecute方法在UI上发布数据:
public class loadData extends AsyncTask<String, Integer, Boolean> {
protected Long doInBackground(String... arg0) {
Oto test = new Oto();
Boolean result = false;
try {
brojevi_varijabla = test.brojevi_739();
result = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
protected void onPostExecute(Boolean result) {
if(result){
if (Integer.valueOf(brojevi_varijabla[0]) > 10) {
Tbroj1.setText("" + brojevi_varijabla[0]);
} else {
Tbroj1.setText(" " + brojevi_varijabla[0]);
}
}
}
}
公共类loadData扩展异步任务{
受保护的长doInBackground(字符串…arg0){
Oto测试=新的Oto();
布尔结果=假;
试一试{
brojevi_varijabla=test.brojevi_739();
结果=真;
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回结果;
}
受保护的void onPostExecute(布尔结果){
如果(结果){
if(整数值of(brojevi_varijabla[0])>10){
Tbroj1.setText(“+brojevi_varijabla[0]);
}否则{
Tbroj1.setText(“+brojevi_varijabla[0]);
}
}
}
}
您只使用了AsyncTask的“doInBackground”方法,为什么不使用preExecute和postExecute方法。您不能直接使用AsyncTask类而不是在AsyncTask类中实例化Oto类吗?它有许多优点。您不应该直接从doInBackground()访问UI元素请参阅:publishProgress(Progres…)用于此我有一个问题。我的Oto类返回一个类型字符串[]。我还希望一个方法doInBackground返回字符串[],因为我有很多值需要放入带有onPostExecute和.settText的XML中。如果我尝试返回字符串[],程序会给我一个错误使用方法doInBackground???????可以。只需从doInback..返回字符串[],并将其作为参数放入onPostExecute()。然后在onPostExecute()中使用它。