2014-03-29 63 views
0

我的应用程序不会给出任何编译时错误,并且它确实显示了它显示的活动。这是一个简单的按钮活动。当用户点击它时,它应该从网络下载图像。当我点击按钮时,它只是说,“不幸的是,并发已停止。”线程,loadImageFromNetwork - 不幸<application>已停止

我正在阅读android中的线程,并且了解了不在UI线程中执行密集操作并且不从UI线程外部操作UI的规则。我正在练习这个。

我还不熟悉如何阅读logcats。我发布我的logcat,如果有人可以阅读并指出导致问题的原因,那将是非常好的。

此外,loadImageFromNetwork()的实现不是由我编码的。我只是从互联网复制它。所以我没有理解它对decodeStream()方法的调用。这一刻我不担心。

Main.java:-

package com.example.concurrency; 

import java.io.InputStream; 
import java.net.URL; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 
    public static final String key_name="com.practice.firstApp.key"; 
    ImageView imageView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void downloadImage(){ 
     new Thread(new Runnable(){ 

      private Bitmap loadImageFromNetwork(String url){ 
       try { 
       Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(url).getContent()); 
       return bitmap; 
       } catch (Exception e) { 
       e.printStackTrace(); 
       } 
       return null; 
       } 

      public void run(){ 
       final Bitmap bitmap= loadImageFromNetwork("http://www.google.com/imgres?imgurl=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F7%2F7a%2FBasketball.png&imgrefurl=http%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3ABasketball.png&h=340&w=340&tbnid=EJmjEDyJzrhAuM%3A&zoom=1&docid=C_hn8nOgsGmuwM&hl=en&ei=Q0o2U93LNcaIygH4mICQBQ&tbm=isch&ved=0CHwQhBwwBg&iact=rc&dur=3875&page=1&start=0&ndsp=14"); 
       imageView.post(new Runnable(){ 
        public void run(){ 
         imageView.setImageBitmap(bitmap); 
        } 
       }); 
      } 
     }).start(); 
    } 
} 

activity_main.xml中: -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

    tools:context=".MainActivity" > 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 

     android:text="@string/Button_MainActivity" 

     android:onClick="downloadImage"/> 

</RelativeLayout> 

String.xml: -

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <string name="app_name">Concurrency</string> 
    <string name="action_settings">Settings</string> 
    <string name="hello_world">Hello world!</string> 
    <string name="Button_MainActivity">Download</string> 

</resources> 

的Manifest.xml: -

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.concurrency" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="18" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.concurrency.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

logcat的: -

它超出了这个问题的长度。所以你可以找到它here

+0

你会用我的后下肯定你会得到解决...... –

+0

我已经编辑我的代码下面你会尝试这样它会工作,一件事的AsyncTask和处理是最类似的事情和处理程序正在使用运行长时间线程这是主要的事情... –

回答

0

您的downloadImage函数需要将View作为参数。补充一点,它应该修正错误

0

您需要添加下面这行去为你的应用程序访问网络权限......活动内AsynchTask功能

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

接入方法.. ..

BitmapWorkerTask backPropcess = new BitmapWorkerTask(position, ht, 
         wt); 
       backPropcess.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, urls); 

这是一个下载的AsyncTask类

  public BitmapWorkerTask() { 

       } 

       @Override 
       protected Bitmap doInBackground(String... params) { 
            URL url; 
         try { 
          url = new URL(params[0]); 

           HttpURLConnection connection = (HttpURLConnection) url 
             .openConnection(); 
           connection.setConnectTimeout(4000); 
           connection.setReadTimeout(10000); 
           int v = connection.getContentLength() > 0 ? connection 
             .getContentLength() : 0; 

            if (v > 0) { 
             InputStream in = new BufferedInputStream(
               connection.getInputStream(), 32 * 1024); 
             Bitmap bitmap = decodeSampledBitmapFromResource(
               in, ht[i], wt[i]); 
             if (bitmap != null && position != null) { 
              addBitmapToMemoryCache(position, bitmap); 
              System.out.println(position); 

          } 
         } catch (MalformedURLException e) { 
          // e.printStackTrace(); 
         } catch (IOException e) { 
          // e.printStackTrace(); 
         } 


        return bitmap; 
       } 

       @Override 
       protected void onPostExecute(Bitmap result) { 
        imageView.setImageBitmap(result); 
       } 
       } 
+0

谢谢你的回答。 1:我记得要在清单文件中添加代码的第一行是为了访问互联网的权限。你能告诉我接下来的两行是什么意思吗? – Solace

+0

我无法理解您发布的两段代码。我应该将第一部分代码添加到我的活动类中吗? 我现在不想使用Asynctask。其实我正在学习概念,所以我打算在这之后学习使用Handlers和Asynctask。 – Solace

0

你可以使用的AsyncTask或下面的代码

private Handler mhHandler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     if (msg.what == 100 && msg.obj != null) { 
      imageView.setImageBitmap((Bitmap) msg.obj); 
     } 
    }; 
}; 

public void downloadImage(View v) { 
    new Thread(new Runnable() { 
     private Bitmap loadImageFromNetwork(String url) { 
      try { 
       Bitmap bitmap = BitmapFactory 
         .decodeStream((InputStream) new URL(url) 
           .getContent()); 
       return bitmap; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     public void run() { 
      final Bitmap bitmap = loadImageFromNetwork("http://www.google.com/imgres?imgurl=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F7%2F7a%2FBasketball.png&imgrefurl=http%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3ABasketball.png&h=340&w=340&tbnid=EJmjEDyJzrhAuM%3A&zoom=1&docid=C_hn8nOgsGmuwM&hl=en&ei=Q0o2U93LNcaIygH4mICQBQ&tbm=isch&ved=0CHwQhBwwBg&iact=rc&dur=3875&page=1&start=0&ndsp=14"); 
      Message msg = new Message(); 
      msg.what = 100; 
      msg.obj = bitmap; 
      mhHandler.sendMessage(msg); 
     } 
    }).start(); 
} 

,不要忘记把观法downloadImage(视图V)的参数,因为你在呼唤它从布局的onclick。

+0

其实我正在学习(在[this]()教程下面),我只是试图学习如何使用post,postDelayed和runOnUiThread等方法来做到这一点。 一旦我明确了这一点,我将继续学习为此目的使用Handlers和Asynctasks。 – Solace

+0

不是一个问题,只需将方法downloadImage()更改为downloadImage(View v)即可。 –

+0

我做到了。它不工作。 – Solace

0

添加

<uses-permission android:name="android.permission.INTERNET" /> 

同时添加类型的参数 “视图” 你downloadImage功能。

0
private Bitmap loadImageFromNetwork(String src) { 
    try { 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     return BitmapFactory.decodeStream(input); 
    } catch (IOException e) { 
     Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher); 
     e.printStackTrace(); 
     return icon; 
    } 
} 
+1

虽然此代码可能会解决问题,但也可以给出一些小解释。 – Valerica