2014-04-01 73 views
0

我想用一个线程在后台花费几秒钟做一些工作。 我试图显示一个进度对话框,但它根本没有显示。如何使用异步任务

我认为使用异步任务会更好,但每当我尝试时都无法使其工作,主要是因为我无法访问需要在异步任务中修改的变量。

这里是我的线程在单击按钮时被调用:

Thread thread = new Thread() 
     { 
      @Override 
      public void run() { 
       try { 

        for (String s : dLinks) { 
         String pathToFile = s.substring(1)); 
         dURLs.add(dFs.fetchLink(pathToFile, false).toString()); 
        } 

       } catch (DbxException e) { 
        dURL = null; 
        e.printStackTrace(); 
       } 
      } 
     }; 

     thread.start(); 
     try { 
      thread.join(); // I added this as the next part of my code was executing before the thread was finished 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

我能移动这一个异步任务,更新进度条,或者至少表现出旋涂器传回的阵列dURLs到主线程?

+1

从另一个线程访问UI元素,使用'runOnUiThread()'或'Handler' –

+0

也许这可以帮助.... http://www.vogella.com /tutorials/AndroidBackgroundProcessing/article.html – SMR

+0

我不确定我是否能够使用异步任务,是否有使用上述代码并显示进度条,只是为了让用户知道发生了什么。 .. – user3437721

回答

0

在这里,我们叫的AsyncTask与活动的上下文这将喂的AsyncTask在这些活动中的背景显示ProgressDialogAsyncTask运行。

public void onCreate(Bundle savedInstanceState) 
{ 
SpinnerDataTask spinnerDataTask = new SpinnerDataTask(this); 
spinnerDataTask.execute(null); 
} 

的AsyncTask有一个使用做后台工作doInBackground()onPostExecute()发布结果的方法。为了在AsyncTask开始工作时显示视图,onPreExecute()非常适合显示某些东西在后台工作。


private class SpinnerDataTask extends AsyncTask<Void Void, Void> 
{ 
    Context context; 
    public SpinnerDataTask(Context context) { 
     // TODO Auto-generated constructor stub 
     this.context = context; 
    } 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(context); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 
    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 

     try { 
       for (String s : dLinks) { 
        String pathToFile = s.substring(1)); 
        dURLs.add(dFs.fetchLink(pathToFile, false).toString()); 
       } 

      } catch (DbxException e) { 
       dURL = null; 
       e.printStackTrace(); 
      } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
      if (pDialog.isShowing()) 
      { 
       pDialog.dismiss(); 
      } 
    } 
} 
+0

使用'JSONObject'作为参数....我认为它可能是返回类型和'URI'作为这样的参数。 'private class SpinnerDataTask extends AsyncTask '' – SMR

0

你可以使用这样的:

public class web_api_get_thread extends AsyncTask<String, String, String> { 

    private ProgressDialog progressDialog = new ProgressDialog(context); 
    InputStream inputStream = null; 
    String result = ""; 

    protected void onPreExecute() { 

     progressDialog.show(); 
     progressDialog.setCancelable(true); 

    } 

    @Override 
    protected String doInBackground(String... params) { 

     StringBuilder builder = new StringBuilder(); 
     //do your work 
     return builder.toString(); 
    } // protected Void doInBackground(String... params) 


     protected void onPostExecute(String string) { 
this.progressDialog.dismiss(); 
      // see your result here 
     } 

} 
0
import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import de.vogella.android.asyntask.R; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class ReadWebpageAsyncTask extends Activity { 
    private TextView textView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textView = (TextView) findViewById(R.id.TextView01); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) { 
     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     try { 
      HttpResponse execute = client.execute(httpGet); 
      InputStream content = execute.getEntity().getContent(); 

      BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
      String s = ""; 
      while ((s = buffer.readLine()) != null) { 
      response += s; 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     textView.setText(result); 
    } 
    } 

    public void onClick(View view) { 
    DownloadWebPageTask task = new DownloadWebPageTask(); 
    task.execute(new String[] { "http://www.vogella.com" }); 

    } 
} 

创建以下布局。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/readWebpage" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="onClick" 
     android:text="Load Webpage" > 
    </Button> 

    <TextView 
     android:id="@+id/TextView01" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="Placeholder" > 
    </TextView> 

</LinearLayout> 

参考:http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html